2010-12-18 87 views
9

不幸的是,MSDN不夠清楚。我正在編寫一個使用全局鉤子的程序,而且我擔心如果程序異常終止(崩潰,被用戶殺死等)會發生什麼。如何確保在異常終止時調用UnhookWindowsHookEx?

  1. 當進程終止時,Windows是否自動解除由進程安裝的全局鉤子?

  2. 如果沒有,是否可以在另一個進程中調用UnhookWindowsHookEx()來釋放鉤子? (如果它檢測到安裝程序進程已死亡,我正在考慮在掛鉤線程中執行此操作。)

  3. 如果答案爲否,並且不是,則在全局掛鉤處於活動狀態時安裝程序進程終止?處理這種情況的標準方法是什麼?

  4. 我在MSDN上讀過UnhookWindowsHookEx()沒有釋放在其他進程中加載​​的dll,但沒有說明dll何時被釋放。 This article in CodeProject似乎暗示當第一個消息到達掛鉤線程時,dll未被映射(在相應的進程中),因此它緊跟在UnhookWindowsHookEx()調用之後。這是真的嗎?

謝謝。

回答

9
  1. 是的,當一個進程終止後系統會清理它 - 所有的句柄都是隱式關閉的。
  2. 不,它不是,你也不需要。
  3. (這是的,不是不,不,不,不是和不)不,
  4. 我不明白爲什麼在這裏涉及的另一個過程中加載了一個DLL。 (編輯:我最初想到一個系統範圍的鉤子,如CBTProc - 如果你的鉤子是每個進程可能不同)如果你正在處理像@Hans的評論中指出的鏈接,我們已經將自己的DLL注入到了目標進程中,然後您應該將功能卸載到您的DLL中,而不是將它與您的應用程序綁定。 (也就是說,如果將消息發送回您的應用程序在DLL內部失敗,那麼您的DLL應該決定卸載它自己)/編輯當一個DLL被加載到另一個進程中時,它就可以完成釋放。
+3

您的觀點4並不準確,全局鉤子需要將具有鉤子回調的DLL注入到目標進程中。解除鉤子還涉及再次卸載該DLL。關鍵是,這是通過消息循環在進程本身內同步的。 – 2010-12-18 17:34:17

+0

@Hans:這取決於鉤子的種類。系統範圍掛鉤不會將您的DLL注入到目標進程中。很明顯,如果你已經將一個DLL注入到目標進程中,那麼這個進程就是釋放它的那個進程(這就是我上面說的第二句話)。 – 2010-12-18 22:06:29

+0

不,它確實不這樣。複雜,很高興這是你的答案,而不是我的:)這否則Just Works™。 – 2010-12-18 22:12:07

相關問題