Win32 API 日本語リファレンス
ホームNetworking.BackgroundIntelligentTransferService › IBackgroundCopyJob3

IBackgroundCopyJob3

COM
IID443c8934-90ff-48ed-bcde-26f5c7450042継承元IBackgroundCopyJob2自前メソッド開始 vtbl43

公式ドキュメント

IBackgroundCopyJob3 インターフェイスは、ファイルの範囲(レンジ)をダウンロードしたり、リモートファイル名のプレフィックスを変更したりするために使用します。

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 43 HRESULT ReplaceRemotePrefix(LPWSTR OldPrefix, LPWSTR NewPrefix)

ダウンロードジョブ内のすべてのリモート名の先頭のテキストを、指定した文字列で置き換えます。

OldPrefixLPWSTRinリモート名の中で置き換える対象のテキストを示す、null で終わる文字列。このテキストはリモート名の先頭から始まっている必要があります。
NewPrefixLPWSTRin置換後のテキストを含む、null で終わる文字列。

戻り値

このメソッドは、以下の戻り値のほか、その他の値を返します。

戻り値 説明
S_OK
成功
S_FALSE
一致するものが見つかりませんでした。
E_INVALIDARG
NewPrefix を適用すると無効な URL になるか、新しい URL が長すぎます(URL は 2,200 文字を超えることはできません)。

OldPrefix または NewPrefix が空の文字列である場合にも、この戻り値が返されることがあります。

E_NOTIMPL
アップロードジョブまたはアップロード応答ジョブに対してこのメソッドを呼び出すことはできません。このメソッドはダウンロードジョブに対してのみ呼び出してください。
BG_E_INVALID_STATE
ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。

解説(Remarks)

通常、このメソッドは、サーバーが利用できない場合にリモート名のサーバー部分を変更したり、ローミングユーザーを最も近いサーバーに接続させたりするために使用します。このメソッドは、ジョブ内の一致するすべてのリモート名を変更します。特定のファイルのリモート名を変更するには、IBackgroundCopyFile2::SetRemoteName メソッドを使用してください。

ReplaceRemotePrefix メソッドは、ジョブ内のすべてのリモート名に対して大文字と小文字を区別した検索を行います。リモート名の先頭のテキストが OldPrefix の文字列と一致した場合、BITS はそのテキストを NewPrefix の文字列で置き換えます。たとえば、"http://Server/Path/File.ext" を "http://NewServerName/Path/File.ext" に変更するには、OldPrefix に "http://Server"、NewPrefix に "http://NewServerName" を指定します。なお、BITS は検索時にロケール変換を行いません。

新しいリモート名のタイムスタンプまたはファイルサイズが以前のリモート名と異なる場合、または新しいサーバーがチェックポイントによる再開をサポートしていない場合(HTTP のリモート名の場合)、BITS はダウンロードを最初からやり直します。それ以外の場合は、新しいサーバー上で同じ位置から転送が再開されます。既に転送済みのファイルは、BITS が再度転送することはありません。

このメソッドを使用してプロトコルを変更することもできます。ただし、結果として得られる URL が正しい形式にならない場合があります。たとえば、\Server\Dir\File.ext から http://Server\Dir\File.ext に変更しても解決できない可能性があります。代わりに IBackgroundCopyFile2::SetRemoteName メソッドの使用を検討してください。

なお、IBackgroundCopyJobHttpOptions::SetSecurityFlags メソッドを呼び出して BG_HTTP_REDIRECT_POLICY_ALLOW_REPORT フラグを設定している場合、このメソッドが変更対象の URL を見つけられないことがあります。このポリシーは、URL がリダイレクトされた場合に、元の URL を最終的なリダイレクト先の URL に変更するためです。

次の例は、ReplaceRemotePrefix メソッドを呼び出して URL のサーバー名を変更する方法を示しています。この例では、IBackgroundCopyJob 型の変数 pJob が有効であり、ジョブに 1 つ以上のファイルが含まれていることを前提としています。

     IBackgroundCopyJob *pJob;
     IBackgroundCopyJob3 *pJob3 = NULL;

     //Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob3
     //interface pointer. The IBackgroundCopyJob3 interface contains the ReplaceRemotePrefix method.
     hr = pJob->QueryInterface(__uuidof( IBackgroundCopyJob3 ), (void**)&pJob3;);
     if (S_OK == hr)
     {
          pJob->Release(); //No longer need the IBackgoundCopyJob interface pointer.

          //Identify the old and new remote name text. For example, "http://oldservername" and 
          //"http://newservername". For SMB, specify "\\\\oldservername" and "\\\\newservername".
          hr = pJob3->ReplaceRemotePrefix(L"<OLDSERVERNAMEGOESHERE>", L"<NEWSERVERNAMEGOESHERE>");
          if (S_FALSE == hr)
          {
               wprintf(L"The job does not contain files with a remote name that matches the prefix.\n");
          }
          else if (FAILED(hr))
          {
               //Handle error.
               //Returns E_NOTIMPL if not a download job.
               //Returns E_INVALIDARG if new prefix is empty or the resulting URL is invalid.
          }

          pJob3->Release();
     }
     else
     {
          //Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
          //running on the computer is less than BITS 2.0.
     }
vtbl 44 HRESULT AddFileWithRanges(LPWSTR RemoteUrl, LPWSTR LocalName, DWORD RangeCount, BG_FILE_RANGE* Ranges)

ダウンロードジョブにファイルを追加し、そのファイルのうちダウンロードする範囲(レンジ)を指定します。

RemoteUrlLPWSTRin

サーバー上のファイル名を含む、null で終わる文字列。リモート名の指定方法については、BG_FILE_INFO 構造体の RemoteName メンバーと解説セクションを参照してください。

BITS 3.0 以降では、範囲指定に SMB プロトコルはサポートされていません。

BITS 2.5 および 2.0: BITS は範囲指定で SMB プロトコルをサポートします。

LocalNameLPWSTRinクライアント上のファイル名を含む、null で終わる文字列。ローカル名の指定方法については、BG_FILE_INFO 構造体の LocalName メンバーと解説セクションを参照してください。
RangeCountDWORDinRanges の要素数。
RangesBG_FILE_RANGE*inダウンロードする範囲を指定する 1 つ以上の BG_FILE_RANGE 構造体の配列。重複する範囲や重なり合う範囲を指定しないでください。

戻り値

このメソッドは、以下の戻り値のほか、その他の値を返します。

戻り値 説明
S_OK
成功
E_INVALIDARG
次のいずれかの理由により、このエラーが返されることがあります。
  • RangeCount パラメーターが 0 です。1 つ以上の範囲を指定する必要があります。
  • ローカルファイル名またはリモートファイル名が無効です。
  • リモートファイル名がサポートされていないプロトコルを使用しています。
  • ローカルファイル名が相対パスで指定されています。
E_NOTIMPL
アップロードジョブまたはアップロード応答ジョブに対してこのメソッドを呼び出すことはできません。このメソッドはダウンロードジョブに対してのみ呼び出してください。
E_ACCESSDENIED
ユーザーに、クライアント上の指定されたディレクトリへの書き込み権限がありません。
BG_E_INVALID_RANGE
いずれかの範囲が無効です。たとえば、InitialOffset に BG_LENGTH_TO_EOF が設定されている場合などです。
BG_E_OVERLAPPING_RANGES
重複する範囲や重なり合う範囲を指定することはできません。
注意 範囲は長さではなく、オフセットの値で並べ替えられます。同じオフセットを持つ範囲が逆の順序で入力された場合、このエラーが返されます。たとえば、100.5 と 100.0 をこの順序で入力した場合、そのファイルをジョブに追加することはできません。
BG_E_TOO_MANY_RANGES_IN_FILE
1 つのファイルに指定できる範囲の数は、MaxRangesPerFile グループポリシー設定によって決まります。これらの範囲を追加すると MaxRangesPerFile の上限を超えます。
BG_E_INVALID_STATE
ジョブの状態が BG_JOB_STATE_CANCELLED または BG_JOB_STATE_ACKNOWLEDGED であってはなりません。

解説(Remarks)

各範囲は、指定された順序で LocalName のファイルに書き込まれます。たとえば、Ranges がリモートファイルのバイト 100-199、900-999、400-499 を指定している場合、ローカルファイルの長さは 300 バイトになります。ローカルファイルのバイト 0-99 にはリモートファイルのバイト 100-199 が、ローカルファイルのバイト 100-199 にはリモートファイルのバイト 900-999 が、ローカルファイルのバイト 200-299 にはリモートファイルのバイト 400-499 が格納されます。

次の表は、ジョブを再開した後に発生する可能性のあるエラーコードを示しています。これらのエラーが発生すると、ジョブは BG_JOB_STATE_ERROR 状態になります。

エラーコード 説明
BG_E_INVALID_SERVER_RESPONSE BITS は、重複する範囲や重なり合う範囲を統合するサーバーをサポートしていません。
BG_E_INVALID_RANGE いずれかの範囲がリモートファイルの境界外です。
BG_E_INSUFFICIENT_RANGE_SUPPORT サーバーが範囲指定をサポートしていません。

BITS は、転送するファイルのバージョン(内容ではなく、ファイルサイズと日付に基づく)の一貫性を保証しますが、ファイルの集合としての一貫性は保証しません。たとえば、ジョブ内の 2 つのファイルのうち 2 番目のファイルをダウンロードしている最中にサーバー上でファイルが更新された場合、BITS は 2 番目のファイルのダウンロードを最初からやり直しますが、1 番目のファイルは再度ダウンロードされません。

既定では、ユーザーは 1 つのファイルに対して最大 500 個の範囲を追加できます。この制限は、管理者やサービスアカウントには適用されません。既定値を変更するには、MaxRangesPerFile グループポリシーを設定します。

Windows Vista より前: ユーザーがジョブに追加できるファイル数に制限はありません。

Windows BranchCache を有効にしたファイル転送でより良いパフォーマンスを得るには、範囲の長さを 400 バイト以上に設定することを推奨します。

次の例は、AddFileWithRanges メソッドを呼び出して、ダウンロードするファイルの範囲を指定する方法を示しています。この例では、IBackgroundCopyJob 型の変数 pJob が有効であることを前提としています。

    IBackgroundCopyJob *pJob;
    IBackgroundCopyJob3 *pJob3 = NULL;
    DWORD dwRangeCount = 3;                  //Number of elements in Ranges.
    BG_FILE_RANGE Ranges[] = {24, 17,        //Array of ranges to download (offset and length).
                              111, BG_LENGTH_TO_EOF,
                              83, 7
                             };

    //Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob3
    //interface pointer. The IBackgroundCopyJob3 interface contains the AddFileWithRanges method.
    hr = pJob->QueryInterface(__uuidof( IBackgroundCopyJob3 ), (void**)&pJob3;);
    if (S_OK == hr)
    {
         pJob->Release(); //No longer need the IBackgoundCopyJob interface pointer.

         //Add a file to the job and specify the ranges from the file to download.
         hr = pJob3->AddFileWithRanges(L"<REMOTENAMEGOESHERE>", L"<LOCALNAMEGOESHERE>",
                                       dwRangeCount, Ranges);
         if (FAILED(hr))
         {
              //Handle error.
              //Returns E_NOTIMPL if not a download job.
              //Returns E_INVALIDARG if dwRangeCount is zero or the remote or local name is invalid.
              //Returns BG_E_INVALID_RANGE if one of the ranges is invalid.
              //Returns BG_E_OVERLAPPING_RANGES if you specify overlapping or duplicate ranges.
         }

          pJob3->Release(); //Release the interface if you are done with it.
     }
    else
    {
         //Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
         //running on the computer is less than BITS 2.0.
    }
vtbl 45 HRESULT SetFileACLFlags(DWORD Flags)

SMB を使用してファイルをダウンロードまたはアップロードする際に維持する、所有者情報と ACL 情報を指定します。

FlagsDWORDin

SMB を使用してファイルを転送する際に維持する所有者情報と ACL 情報を示すフラグ。このメソッドを再度呼び出すと、以前のフラグは上書きされます。ジョブからフラグを削除するには 0 を指定します。次のフラグを任意に組み合わせて指定できます。

意味
BG_COPY_FILE_OWNER
設定すると、ファイルの所有者情報が維持されます。設定しない場合は、Complete メソッドを呼び出したユーザーがそのファイルの所有者になります。

このフラグを設定するには SeRestorePrivilege が必要です。Administrators グループは SeRestorePrivilege 特権を持っています。

BG_COPY_FILE_GROUP
設定すると、ファイルのグループ情報が維持されます。設定しない場合、BITS はジョブ所有者のプライマリグループを使用してファイルにグループ情報を割り当てます。

このフラグを設定するには SeRestorePrivilege が必要です。Administrators グループは SeRestorePrivilege 特権を持っています。

BG_COPY_FILE_DACL
設定すると、BITS はソースファイルの明示的な ACE と、コピー先フォルダーの継承可能な ACE をコピーします。 設定しない場合、BITS はコピー先フォルダーの継承可能な ACE のみをコピーします。コピー先フォルダーに継承可能な ACE が含まれていない場合、BITS は所有者のアカウントの既定の DACL を使用します。
BG_COPY_FILE_SACL
設定すると、BITS はソースファイルの明示的な ACE と、コピー先フォルダーの継承可能な ACE をコピーします。 設定しない場合、BITS はコピー先フォルダーの継承可能な ACE のみをコピーします。

このフラグを設定するには、ローカルコンピューターとリモートコンピューターの両方で SeSecurityPrivilege が必要です。Administrators グループは SeSecurityPrivilege 特権を持っています。

BG_COPY_FILE_ALL
設定すると、BITS は所有者情報と ACL 情報をコピーします。これは、すべてのフラグを個別に設定した場合と同じです。

戻り値

このメソッドは、以下の HRESULT 値のほか、その他の値を返します。

戻り値 説明
S_OK
フラグを正常に設定しました。
BG_E_INVALID_STATE
このメソッドは、ジョブが BG_JOB_STATE_TRANSFERRED 状態に遷移する前に呼び出す必要があります。
E_INVALIDARG
Flags パラメーターに、一覧にないフラグが含まれています。

解説(Remarks)

これらのフラグは、SMB プロトコルを指定するリモートファイル名に適用されます。HTTP 転送の場合、BITS はこれらのフラグを無視します。

BITS は、SMB ファイルについてはファイルのタイムスタンプと属性(拡張属性は除く)を引き継ぎます。

BITS は、一時転送ファイルを作成する時点ではなく、ファイル転送が完了した時点で所有者情報と ACL 情報をファイルに適用します。BITS は一時転送ファイルを作成する際にセキュリティ記述子を指定しません(ファイルはコピー先ディレクトリから ACL 情報を継承します)。転送するデータが機密である場合、アプリケーションは不正アクセスを防ぐために、コピー先ディレクトリに適切な ACL を指定する必要があります。

ジョブ内のすべてのファイルに適切な所有者情報と ACL 情報が設定されるようにするには、ジョブを作成した後、IBackgroundCopyJob::Resume メソッドを呼び出す前に、このメソッドを呼び出してください。そうしないと、フラグを設定する前に転送されたファイルには、適切な所有者情報と ACL 情報が設定されません。

このメソッドは、DOS の XCopy コマンドをモデルにしています。

FAT ファイルシステムにダウンロードする場合、所有者情報と ACL 情報は維持されません。

所有者情報または ACL 情報をコピーするための特権をユーザーがローカルコンピューターおよびリモートコンピューターで持っていない場合、BITS はジョブを一時的なエラー状態にし、エラーコードを E_ACCESSDENIED に設定します。

次の例は、SetFileACLFlags メソッドを呼び出して、BITS がダウンロードするファイルに対して維持する所有者情報と ACL 情報を指定する方法を示しています。この例では、IBackgroundCopyJob 型の変数 pJob が有効であり、新しいジョブを指していて、かつ中断状態であることを前提としています。

     IBackgroundCopyJob *pJob;
     IBackgroundCopyJob3 *pJob3 = NULL;

     //Need to query the IBackgroundCopyJob interface for an IBackgroundCopyJob3
     //interface pointer. The IBackgroundCopyJob3 interface contains the SetACLFlags method.
     hr = pJob->QueryInterface(__uuidof( IBackgroundCopyJob3 ), (void**)&pJob3;);
     if (S_OK == hr)
     {
          pJob->Release(); //No longer need the IBackgoundCopyJob interface pointer.

          //Copy the group and DACL information for each file.
          hr = pJob3->SetACLFlags(BG_COPY_FILE_GROUP | BG_COPY_FILE_DACL);
          if (FAILED(hr))
          {
               //Handle error.
          }

          ... //Add one or more files and resume the job.
          pJob3->Resume();

          //When done, release the interface pointer.
          pJob3->Release();
     }
     else
     {
          //Handle error. QueryInterface will return E_NOINTERFACE if the version of BITS
          //running on the computer is less than BITS 2.0.
     }
vtbl 46 HRESULT GetFileACLFlags(DWORD* Flags)

SMB を使用してファイルを転送する際に維持する所有者情報と ACL 情報を示すフラグを取得します。

FlagsDWORD*out

SMB を使用してファイルを転送する際に維持する所有者情報と ACL 情報を示すフラグ。Flags には次のフラグの任意の組み合わせが格納されます。フラグが 1 つも設定されていない場合、Flags は 0 になります。

意味
BG_COPY_FILE_OWNER
設定されている場合、ファイルの所有者情報が維持されます。設定されていない場合は、ジョブの所有者がそのファイルの所有者になります。
BG_COPY_FILE_GROUP
設定されている場合、ファイルのグループ情報が維持されます。設定されていない場合、BITS はジョブ所有者のプライマリグループを使用してファイルにグループ情報を割り当てます。
BG_COPY_FILE_DACL
設定されている場合、BITS はソースファイルの明示的な ACE と、コピー先の親フォルダーの継承可能な ACE をコピーします。 設定されていない場合、BITS はコピー先の親フォルダーの継承可能な ACE のみをコピーします。親フォルダーに継承可能な ACE が含まれていない場合、BITS はそのアカウントの既定の DACL を使用します。
BG_COPY_FILE_SACL
設定されている場合、BITS はソースファイルの明示的な ACE と、コピー先の親フォルダーの継承可能な ACE をコピーします。 設定されていない場合、BITS はコピー先の親フォルダーの継承可能な ACE のみをコピーします。
BG_COPY_FILE_ALL
設定されている場合、BITS は所有者情報と ACL 情報をコピーします。これは、すべてのフラグを個別に設定した場合と同じです。

戻り値

このメソッドは、以下の HRESULT 値のほか、その他の値を返します。

戻り値 説明
S_OK
フラグを正常に取得しました。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IBackgroundCopyJob3 "{443C8934-90FF-48ED-BCDE-26F5C7450042}"
#usecom global IBackgroundCopyJob3 IID_IBackgroundCopyJob3 "{}"
#comfunc global IBackgroundCopyJob3_ReplaceRemotePrefix  43 wstr,wstr
#comfunc global IBackgroundCopyJob3_AddFileWithRanges    44 wstr,wstr,int,var
#comfunc global IBackgroundCopyJob3_SetFileACLFlags      45 int
#comfunc global IBackgroundCopyJob3_GetFileACLFlags      46 var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。