残念ながら、MSDNは十分に明確ではありません。私はグローバルなフックを使用するプログラムを書いています。プログラムが異常終了した場合(クラッシュ、ユーザーによる死亡など)に何が起こるか心配しています。異常終了してもUnhookWindowsHookExが確実に呼び出されるようにするにはどうすればよいですか?
プロセスが終了すると、Windowsはプロセスによってインストールされたグローバルフックを自動的に解除しますか?
もしそうでなければ、別のプロセスでUnhookWindowsHookEx()を呼び出してフックを解放することはできますか? (私は、インストールされたプロセスが死んでいることを検出した場合、これをフックスレッドで行うことを考えています)。
回答がノーとノーならば、インストーラプロセスは終了しますか?この状況を扱う標準的な方法は何ですか?
UnhookWindowsHookEx()は他のプロセスに読み込まれたDLLを解放しないが、いつDLLが解放されるのかをMSDNで読みました。 This article in CodeProjectは、最初のメッセージがフックされたスレッドに到着したときにdllが(それぞれのプロセスで)マッピングされていないことを示唆しているように見えるので、UnhookWindowsHookEx()呼び出しの直後です。本当ですか?
ありがとうございます。
ポイント4は正確ではありません。グローバルフックでは、フックコールバックを持つDLLをターゲットプロセスに注入する必要があります。 Unhookingには、そのDLLを再度アンロードすることも含まれます。キーポイントは、これがメッセージループを通じてプロセス自体の内部で同期されるということです。 –
@ハンス:それはフックの種類によって異なります。システム全体のフックは、DLLをターゲットプロセスに注入しません。明らかに、あなたがそのターゲットプロセスにDLLを注入したならば、そのプロセスはそれを解放する人になるでしょう(これは、上記の2番目の文が言います)。 –
いいえ、実際にはそのようには機能しません。複雑で、嬉しいのはあなたの答えで、私のものではありません:)そうでなければJust Works™。 –