12

残念ながら、MSDN はそれについて十分に明確ではありません。グローバルフックを使用するプログラムを書いていますが、プログラムが異常終了した場合 (クラッシュ、ユーザーによる強制終了など) がどうなるか心配しています。

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

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

  3. 答えが「いいえ」または「いいえ」の場合、インストーラー プロセスが終了したときにグローバル フックをアクティブのままにしておくのは危険ではないでしょうか? この状況に対処する標準的な方法は何ですか?

  4. UnhookWindowsHookEx() は他のプロセスにロードされた dll を解放しないことを MSDN で読みましたが、いつ dll が解放されるかはわかりません。CodeProject のこの記事は、最初のメッセージがフックされたスレッドに到着したときに dll が (それぞれのプロセスで) マップされていないことを示唆しているように思われるため、UnhookWindowsHookEx() 呼び出しの直後です。本当ですか?

ありがとうございました。

4

2 に答える 2

11
  1. はい、プロセスが終了すると、システムはその後クリーンアップします。すべてのハンドルは暗黙的に閉じられます。
  2. いいえ、そうではありません。とにかくその必要はありません。
  3. (それはイエスとノーであり、ノーとノーではありません)
  4. ここに関係する別のプロセスに DLL がロードされている理由がわかりません。(編集:私はもともとCBTProcなどのシステム全体のフックを考えていました-フックがプロセスごとに異なる場合) @Hans のコメントに示されているリンクのようなものを扱っている場合、それによって注入しました独自の DLL をターゲット プロセスに追加する場合は、フックをアンロードする機能を DLL 内に配置する必要があります。正しい操作をアプリケーションに結び付けるのではありません。(つまり、アプリケーションへのメッセージの返送が DLL 内で失敗した場合、DLL はそれ自体をアンロードすることを決定する必要があります) /EDIT DLL が別のプロセス内でロードされた場合、解放を行うのはそのプロセス次第です。
于 2010-12-18T16:45:13.877 に答える