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