ICopyHookA
COM公式ドキュメント
コピーフックハンドラーを作成するメソッドを公開します。(ANSI)
解説(Remarks)
コピーフックハンドラーは OLE インプロセスサーバー(dll)であり、タスクそのものを実行するのではなく、その操作を承認または拒否します。シェルがコピーフックハンドラーから承認を受け取ると、ファイルシステム操作を実行します。コピーフックハンドラーには操作の成否は通知されないため、FindFirstChangeNotification を使用しない限り、フォルダーオブジェクトに対して行われた操作を監視することはできません。
フォルダーオブジェクトは複数のコピーフックハンドラーを持つことができます。たとえば、特定のフォルダーオブジェクトに対してシェルが既にコピーフックハンドラーを登録している場合でも、独自のハンドラーを登録できます。1 つのオブジェクトに対して 2 つ以上のコピーフックハンドラーが登録されている場合、シェルは指定されたファイルシステム操作のいずれかを実行する前に、それぞれのハンドラーを単純に呼び出します。
シェルは、IShellExtInit インターフェイスを先に使用することなく、ICopyHookA を直接初期化します。
CopyCallback は、シェルが操作を実行すべきかどうかを示す int 値を返します。シェルは、フォルダーオブジェクトに対して登録されている各コピーフックハンドラーを、すべてのハンドラーが呼び出されるか、いずれかが IDYES 以外の値を返すまで呼び出します。ハンドラーは、操作を実行すべきことを指定するには IDYES を返し、操作を中止すべきことを指定するには IDNO または IDCANCEL を返します。
これらのファイルシステム操作を特定のオブジェクトに対していつ実行するか、あるいは実行するかどうかを制御できるようにしたい場合は、コピーフックハンドラーを実装します。たとえば、共有フォルダーに対してコピーフックハンドラーを使用したい場合があります。
このシェル拡張を直接呼び出すことはありません。CopyCallback は、シェルフォルダーオブジェクトを移動、コピー、削除、または名前変更する前に、シェルによって呼び出されます。
shlobj.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして ICopyHook を定義しています。エンコーディング非依存のエイリアスの使用を、エンコーディング非依存ではないコードと混在させると、コンパイルエラーや実行時エラーを引き起こす不整合につながる可能性があります。詳細については、関数プロトタイプの規則を参照してください。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
シェルがフォルダーまたはプリンターオブジェクトの移動、コピー、削除、または名前変更を許可されるかどうかを決定します。(ANSI)
| hwnd | HWND | inoptional | コピーフックハンドラーが、表示する必要のあるユーザーインターフェイス要素の親として使用するウィンドウへのハンドル。wFunc に FOF_SILENT が指定されている場合、メソッドはこのパラメーターを無視する必要があります。 | ||||||||||
| wFunc | DWORD | in | 実行する操作。このパラメーターには、SHFILEOPSTRUCT 構造体の wFunc メンバーに記載されている値のいずれかを指定できます。 | ||||||||||
| wFlags | DWORD | in | 操作を制御するフラグ。このパラメーターには、SHFILEOPSTRUCT 構造体の fFlags メンバーに記載されている値の 1 つ以上を指定できます。 プリンターのコピーフックの場合、この値は Shellapi.h で定義されている次の値のいずれかになります。
| ||||||||||
| pszSrcFile | LPSTR | in | コピー元フォルダーの名前を含む文字列へのポインター。 | ||||||||||
| dwSrcAttribs | DWORD | in | コピー元フォルダーの属性。このパラメーターには、ヘッダーファイルで定義されているファイル属性フラグ(FILE_ATTRIBUTE_*)の任意の組み合わせを指定できます。ファイル属性定数を参照してください。 | ||||||||||
| pszDestFile | LPSTR | inoptional | コピー先フォルダーの名前を含む文字列へのポインター。 | ||||||||||
| dwDestAttribs | DWORD | in | コピー先フォルダーの属性。このパラメーターには、ヘッダーファイルで定義されているファイル属性フラグ(FILE_ATTRIBUTE_*)の任意の組み合わせを指定できます。ファイル属性定数を参照してください。 |
戻り値
シェルが操作を実行すべきかどうかを示す整数値を返します。次のいずれかです。
| 値 | 説明 |
|---|---|
| IDYES | 操作を許可します。 |
| IDNO | このフォルダーに対する操作を阻止しますが、承認済みの他の操作(たとえばバッチコピー操作)は続行します。 |
| IDCANCEL | 現在の操作を阻止し、保留中のすべての操作をキャンセルします。 |
解説(Remarks)
シェルは、フォルダーまたはプリンターオブジェクトに対して登録されている各コピーフックハンドラーを、すべてのハンドラーが呼び出されるか、いずれかが IDNO または IDCANCEL を返すまで呼び出します。
フォルダー用のコピーフックハンドラーは、次のキーの下に登録されます。
HKEY_CLASSES_ROOT/Directory/Shellex/CopyHookHandlers/your_copyhook/{copyhook CLSID value}
プリンター用のコピーフックハンドラーは、次のキーの下に登録されます。
HKEY_CLASSES_ROOT/Printers/Shellex/CopyHookHandlers/your_copyhook/{copyhook CLSID value}
このメソッドが呼び出されると、シェルは IShellExtInit インターフェイスを先に使用することなく、ICopyHookA インターフェイスを直接初期化します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ICopyHookA "{000214EF-0000-0000-C000-000000000046}"
#usecom global ICopyHookA IID_ICopyHookA "{}"
#comfunc global ICopyHookA_CopyCallback 3 sptr,int,int,str,int,str,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。