フックは、ShellExecuteまたはShellExecuteExの呼び出しを検出したい場合に使用します。した瞬間を検出したい場合は便利な存在になるでしょう。マネージャ」を選択した場合に呼び出します。次に示す図は、その呼び出しを検出した瞬間を表しています。フックのオブジェクトは、IShellExecuteHookを実装する必要があります。m_cRef;};IShellExecuteHookのメソッドはExecuteのみです。S_OKを返すことで関数を失敗、S_FALSEを返すことで関数の処理を続行させることができます。引数の中身を変更しても、関数の呼び出し側には影響がないことに注意してください。今回のExecuteの処理は、MessageBoxを呼び出すだけの単純なものです。S_FALSE;}第1引数のSHELLEXECUTEINFO構造体には、ShellExecute(Ex)の引数に関連した値が格納されています。第4引数はpei->lpParametersに関連します。このパスが特定のパスと一致するかを調べ、それが一致する場合はS_OKを返すようにするのもよいでしょう。これにより、lpFileで識別されるファイルの実行を拒否することができます。フックを登録するには、次に示すレジストリキーを作成することになります。自動でアンロードされることはありません。登録したDLLを置き換える場合は、登録を解除してからシェルを再起動する必要があります。プロセスの起動を検出するという目的ではIShellExecuteHookは使いにくいと言えます。ShellExecuteが次のように呼び出されたとします。メモ帳の起動を検出できることになります。どのような場合でも対応できるコードを記述する必要があります。次のようにShellExecuteが呼ばれた場合はどうなるでしょうか。最終的にどのプロセスが起動されるかが一目で判断できません。AssocQueryStringで関連するプロセス名を取得できるのですが、実際にはこれでも不完全です。IShellExecuteHook::Execute自体が呼ばれないからです。Vistaから推奨されなくなっています。これはどういった経緯からか分かりませんが、今後も問題なく使い続けられるとは限らない可能性があります。フックはシェルにロードされません。フックはロードされるはずです。