2010-12-18 10 views
9

残念ながら、MSDNは十分に明確ではありません。私はグローバルなフックを使用するプログラムを書いています。プログラムが異常終了した場合(クラッシュ、ユーザーによる死亡など)に何が起こるか心配しています。異常終了してもUnhookWindowsHookExが確実に呼び出されるようにするにはどうすればよいですか?

  1. プロセスが終了すると、Windowsはプロセスによってインストールされたグローバルフックを自動的に解除しますか?

  2. もしそうでなければ、別のプロセスでUnhookWindowsHookEx()を呼び出してフックを解放することはできますか? (私は、インストールされたプロセスが死んでいることを検出した場合、これをフックスレッドで行うことを考えています)。

  3. 回答がノーとノーならば、インストーラプロセスは終了しますか?この状況を扱う標準的な方法は何ですか?

  4. UnhookWindowsHookEx()は他のプロセスに読み込まれたDLLを解放しないが、いつDLLが解放されるのかをMSDNで読みました。 This article in CodeProjectは、最初のメッセージがフックされたスレッドに到着したときにdllが(それぞれのプロセスで)マッピングされていないことを示唆しているように見えるので、UnhookWindowsHookEx()呼び出しの直後です。本当ですか?

ありがとうございます。

答えて

9
  1. はい、プロセスが終了すると、システムはそれ以降にクリーンアップされます。すべてのハンドルは暗黙的に閉じられます。
  2. いいえ、それではなく、とにかく必要はありません。
  3. ここに含まれる別のプロセスにDLLが読み込まれている理由がわかりません。 (編集:私はもともとシステム全体のフックをCBTProcのように考えていました - あなたのフックがプロセスごとに異なるかもしれない場合)@Hansのコメントに示されたリンクのようなものを扱っているなら、あなた自身のDLLをターゲットプロセスに注入した後、DLLにフックをアンロードする機能を置いて、アプリケーションが正しい動作をしないようにする必要があります。 DLLが別のプロセスの中にロードされているときは、そのプロセスをフリーズすることになります。つまり、DLLがアプリケーション内で失敗した場合、DLLは自身をアンロードすることになります。/EDIT
+3

ポイント4は正確ではありません。グローバルフックでは、フックコールバックを持つDLLをターゲットプロセスに注入する必要があります。 Unhookingには、そのDLLを再度アンロードすることも含まれます。キーポイントは、これがメッセージループを通じてプロセス自体の内部で同期されるということです。 –

+0

@ハンス:それはフックの種類によって異なります。システム全体のフックは、DLLをターゲットプロセスに注入しません。明らかに、あなたがそのターゲットプロセスにDLLを注入したならば、そのプロセスはそれを解放する人になるでしょう(これは、上記の2番目の文が言います)。 –

+0

いいえ、実際にはそのようには機能しません。複雑で、嬉しいのはあなたの答えで、私のものではありません:)そうでなければJust Works™。 –

関連する問題