IFileOperationProgressSink
COM公式ドキュメント
IFileOperation を呼び出す側が、そのインターフェイスを通じて実行している操作の詳細を監視するために使用する、高機能な通知システムを提供するメソッドを公開します。
解説(Remarks)
実装するタイミング
アプリケーションは IFileOperationProgressSink を自身で実装する必要があります。Windows は既定の実装を提供しません。使用するタイミング
IFileOperationProgressSink は、本質的に特定のイベントに対するハンドラーです。通常、その時点で処理されている具体的な処理に関する情報(ファイル名、コピー元とコピー先、コピー先での項目の新しい名前など)を表示するために使用されます。Post 系メソッドは操作の各部分の HRESULT を受け取るため、呼び出し側は処理が失敗した場合にどこで失敗したかを具体的に特定できます。IFileOperation のメソッドのパラメーター値は、適切な IFileOperationProgressSink のメソッドに渡されるため、それらのメソッドは同じ情報にアクセスできます。IFileOperation の呼び出しに IFileOperationProgressSink の実装をアタッチするには、次の 2 つの方法があります。
- IFileOperation の呼び出しで実行されるすべての操作について通知を受け取るには、IFileOperation::Advise メソッドを使用します。
- 特定の操作の進行状況のみについて通知を受け取るには、IFileOperationProgressSink を次の個別の IFileOperation メソッドの 1 つ以上に渡します。
選択したメソッドにのみ IFileOperationProgressSink を渡す場合、それらすべてに対して同じ IFileOperationProgressSink のインスタンスを使用できます。
例
次の例では、Advise メソッドを呼び出して、IFileOperation のインスタンスに IFileOperationProgressSink を渡します。IFileOperation *pfo;
CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, IID_IFileOperation, (void **)&m_pFO)
HRESULT hr = SHCreateFileOperation(hwnd, 0, IID_PPV_ARGS(&pfo));
if (SUCCEEDED(hr))
{
// Advise to get notifications
DWORD dwCookie;
hr = pfo->Advise(SAFECAST(this, IFileOperationProgressSink*), &dwCookie);
}
メソッド 16
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
個々のファイル操作が実行される前に、呼び出し側が実装したアクションを実行します。
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
StartOperations は、PerformOperations の後に呼び出される IFileOperationProgressSink メソッドのうち、最初に呼び出されるものです。ファイル操作が開始される前に必要なセットアップや初期化を行うために使用できます。
IFileOperation の呼び出しによって実行される最後の操作が完了した後に、呼び出し側が実装したアクションを実行します。
| hrResult | HRESULT | in | 最終操作の戻り値。これは、操作をキューに登録するだけの IFileOperation のいずれかのメソッドが返す HRESULT ではないことに注意してください。これは、コピー、削除、移動などの実際の操作の結果です。 |
戻り値
型: HRESULT
使用されません。
各項目の名前変更処理が始まる前に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 操作を制御するフラグを含むビット単位の値。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | 名前変更する項目を指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 項目の新しい表示名へのポインター。これは null 終端の Unicode 文字列です。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、名前変更操作および IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目の名前変更処理が完了した後に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 名前変更操作中に使用されたフラグを含むビット単位の値。一部の値は名前変更操作中に設定または変更されることがあります。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | 名前変更される前の項目を指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 項目の新しい表示名へのポインター。これは null 終端の Unicode 文字列です。名前の衝突やその他の命名規則により、要求した名前とは異なる場合があることに注意してください。 |
| hrRename | HRESULT | in | 名前変更操作の戻り値。これは、名前変更操作をキューに登録するだけの RenameItem が返す HRESULT ではないことに注意してください。これは、実際の名前変更操作の結果です。 |
| psiNewlyCreated | IShellItem* | in | 新しい名前を持つ項目を表す IShellItem へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目の移動処理が始まる前に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 操作を制御するフラグを含むビット単位の値。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | 移動する項目を指定する IShellItem へのポインター。 |
| psiDestinationFolder | IShellItem* | in | 移動した項目を格納する移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 新しい場所での項目の新しい名前へのポインター。これは null 終端の Unicode 文字列であり、NULL にすることができます。NULL の場合、移動先の項目の名前はコピー元と同じになります。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、移動操作および IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目の移動処理が完了した後に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 移動操作中に使用されたフラグを含むビット単位の値。一部の値は移動操作中に設定または変更されることがあります。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | コピー元の項目を指定する IShellItem へのポインター。 |
| psiDestinationFolder | IShellItem* | in | 移動した項目を格納する移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 移動後に項目に付けられた名前へのポインター。これは null 終端の Unicode 文字列です。名前の衝突やその他の命名規則により、要求した名前とは異なる場合があることに注意してください。 |
| hrMove | HRESULT | in | 移動操作の戻り値。これは、移動操作をキューに登録するだけの MoveItem が返す HRESULT ではないことに注意してください。これは、実際の移動の結果です。 |
| psiNewlyCreated | IShellItem* | in | 新しい場所に移動した項目を表す IShellItem へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目のコピー処理が始まる前に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 操作を制御するフラグを含むビット単位の値。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | コピー元の項目を指定する IShellItem へのポインター。 |
| psiDestinationFolder | IShellItem* | in | 項目のコピーを格納する移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | コピー後の項目の新しい名前へのポインター。これは null 終端の Unicode 文字列であり、NULL にすることができます。NULL の場合、移動先の項目の名前はコピー元と同じになります。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、コピー操作および IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目のコピー処理が完了した後に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | コピー操作中に使用されたフラグを含むビット単位の値。一部の値はコピー操作中に設定または変更されることがあります。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | コピー元の項目を指定する IShellItem へのポインター。 |
| psiDestinationFolder | IShellItem* | in | 項目のコピー先となった移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | コピー後に項目に付けられた新しい名前へのポインター。これは null 終端の Unicode 文字列です。名前の衝突やその他の命名規則により、要求した名前とは異なる場合があることに注意してください。 |
| hrCopy | HRESULT | in | コピー操作の戻り値。これは、コピー操作をキューに登録するだけの CopyItem が返す HRESULT ではないことに注意してください。これは、実際のコピーの結果です。 |
| psiNewlyCreated | IShellItem* | in | 項目の新しいコピーを表す IShellItem へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目の削除処理が始まる前に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 操作を制御するフラグを含むビット単位の値。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | 削除する項目を指定する IShellItem へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、削除操作および IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
各項目の削除処理が完了した後に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 削除操作中に使用されたフラグを含むビット単位の値。一部の値は削除操作中に設定または変更されることがあります。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiItem | IShellItem* | in | 削除された項目を指定する IShellItem へのポインター。 |
| hrDelete | HRESULT | in | 削除操作の戻り値。これは、削除操作をキューに登録するだけの DeleteItem が返す HRESULT ではないことに注意してください。これは、実際の削除の結果です。 |
| psiNewlyCreated | IShellItem* | in | ごみ箱に入った、削除された項目を指定する IShellItem へのポインター。項目が完全に削除された場合、この値は NULL になります。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
新しい項目を作成する処理が始まる前に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 操作を制御するフラグを含むビット単位の値。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiDestinationFolder | IShellItem* | in | 新しい項目を格納する移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 新しい項目のファイル名へのポインター(例: Newfile.txt)。これは null 終端の Unicode 文字列です。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、この操作および IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
新しい項目が作成された後に、呼び出し側が実装したアクションを実行します。
| dwFlags | DWORD | in | 作成操作中に使用されたフラグを含むビット単位の値。一部の値は作成操作中に設定または変更されることがあります。フラグの説明については TRANSFER_SOURCE_FLAGS を参照してください。 |
| psiDestinationFolder | IShellItem* | in | 新しい項目が追加された移動先フォルダーを指定する IShellItem へのポインター。 |
| pszNewName | LPWSTR | in | 新しい項目のファイル名へのポインター(例: Newfile.txt)。これは null 終端の Unicode 文字列です。 |
| pszTemplateName | LPWSTR | in | 新しい項目の基になるテンプレートファイル(例: Excel9.xls)の名前へのポインター。次のいずれかの場所に格納されています。
このパラメーターは通常、新しい空のファイルを指定するために NULL にします。 |
| dwFileAttributes | DWORD | in | 新しい項目に適用されるファイル属性。GetFileAttributes にある値の 1 つ以上を指定します。 |
| hrNew | HRESULT | in | 作成操作の戻り値。これは、作成操作をキューに登録するだけの NewItem が返す HRESULT ではないことに注意してください。これは、実際の作成の結果です。 |
| psiNewItem | IShellItem* | in | 新しい項目を表す IShellItem へのポインター。 |
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合はエラー値を返します。エラー値の場合、IFileOperation の呼び出しによって保留されている以降のすべての操作がキャンセルされます。
現在完了している作業量を、総作業量との関係で見積もった値を提供します。
| iWorkTotal | DWORD | in | 完了すべき作業量の見積もり。 |
| iWorkSoFar | DWORD | in | これまでに完了した iWorkTotal の割合。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
iWorkTotal と iWorkSoFar の値は、実行すべき作業量とその完了度を表す「ポイント」または見積もりです。特定の単位で指定されるものではありませんが、処理全体にかかる時間におおよそ比例するようにします。たとえば、1 つの小さなファイルのコピーを 2 ポイント、大きなファイルを 10 ポイントと見なすことができます。5 つの小さなファイルと 1 つの大きなファイルをコピーする操作を実行しているプロセスが、小さなファイルのうち 4 つを完了した場合、iWorkSoFar は 8 ポイント(4 × 2 = 8)、iWorkTotal は 20 ポイント(5 × 2 + 10 = 20)となり、見積もりは 20 ポイント中 8 ポイント(つまり 40%)完了となります。
サポートされていません。(IFileOperationProgressSink.ResetTimer)
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
サポートされていません。(IFileOperationProgressSink.PauseTimer)
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
サポートされていません。(IFileOperationProgressSink.ResumeTimer)
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFileOperationProgressSink "{04B0F1A7-9490-44BC-96E1-4296A31252E2}"
#usecom global IFileOperationProgressSink IID_IFileOperationProgressSink "{}"
#comfunc global IFileOperationProgressSink_StartOperations 3
#comfunc global IFileOperationProgressSink_FinishOperations 4 int
#comfunc global IFileOperationProgressSink_PreRenameItem 5 int,sptr,wstr
#comfunc global IFileOperationProgressSink_PostRenameItem 6 int,sptr,wstr,int,sptr
#comfunc global IFileOperationProgressSink_PreMoveItem 7 int,sptr,sptr,wstr
#comfunc global IFileOperationProgressSink_PostMoveItem 8 int,sptr,sptr,wstr,int,sptr
#comfunc global IFileOperationProgressSink_PreCopyItem 9 int,sptr,sptr,wstr
#comfunc global IFileOperationProgressSink_PostCopyItem 10 int,sptr,sptr,wstr,int,sptr
#comfunc global IFileOperationProgressSink_PreDeleteItem 11 int,sptr
#comfunc global IFileOperationProgressSink_PostDeleteItem 12 int,sptr,int,sptr
#comfunc global IFileOperationProgressSink_PreNewItem 13 int,sptr,wstr
#comfunc global IFileOperationProgressSink_PostNewItem 14 int,sptr,wstr,wstr,int,int,sptr
#comfunc global IFileOperationProgressSink_UpdateProgress 15 int,int
#comfunc global IFileOperationProgressSink_ResetTimer 16
#comfunc global IFileOperationProgressSink_PauseTimer 17
#comfunc global IFileOperationProgressSink_ResumeTimer 18
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。