9
不幸的是,MSDN不夠清楚。我正在編寫一個使用全局鉤子的程序,而且我擔心如果程序異常終止(崩潰,被用戶殺死等)會發生什麼。如何確保在異常終止時調用UnhookWindowsHookEx?
當進程終止時,Windows是否自動解除由進程安裝的全局鉤子?
如果沒有,是否可以在另一個進程中調用UnhookWindowsHookEx()來釋放鉤子? (如果它檢測到安裝程序進程已死亡,我正在考慮在掛鉤線程中執行此操作。)
如果答案爲否,並且不是,則在全局掛鉤處於活動狀態時安裝程序進程終止?處理這種情況的標準方法是什麼?
我在MSDN上讀過UnhookWindowsHookEx()沒有釋放在其他進程中加載的dll,但沒有說明dll何時被釋放。 This article in CodeProject似乎暗示當第一個消息到達掛鉤線程時,dll未被映射(在相應的進程中),因此它緊跟在UnhookWindowsHookEx()調用之後。這是真的嗎?
謝謝。
您的觀點4並不準確,全局鉤子需要將具有鉤子回調的DLL注入到目標進程中。解除鉤子還涉及再次卸載該DLL。關鍵是,這是通過消息循環在進程本身內同步的。 – 2010-12-18 17:34:17
@Hans:這取決於鉤子的種類。系統範圍掛鉤不會將您的DLL注入到目標進程中。很明顯,如果你已經將一個DLL注入到目標進程中,那麼這個進程就是釋放它的那個進程(這就是我上面說的第二句話)。 – 2010-12-18 22:06:29
不,它確實不這樣。複雜,很高興這是你的答案,而不是我的:)這否則Just Works™。 – 2010-12-18 22:12:07