2011-06-23 55 views
7

我正在向某個進程注入一個DLL,該DLL有一個正在運行消息循環的工作線程。如何正確終止注入DLL中的工作線程?

我想正確退出線程,即發佈退出消息(PostThreadMessage)並等待它(WaitForSingleObject)。

我在哪裏可以等待此線程關閉?我不能在DLL_PROCESS_DETACH上執行它,因爲那時所有的線程都關閉或終止,我不知道進程何時關閉。

我唯一的想法是,有沒有辦法攔截主線程消息循環,並尋找WM_CLOSE \ DESTROY消息?

我很樂意聽到任何其他想法\解決方案。

編輯:
試圖鉤住使用調用SetWindowsHookEx與WH_CALLWNDPROC主線程,但它並沒有做得很不錯,我設法鉤和接收線程的消息。但是,我沒有收到WM_QUIT消息,只有WM_DESTROY和WM_NCDESTROY,它們都與Windows相關聯。

感謝,
奧馬爾

回答

3

如果您需要在執行一些動作的「關於對關閉」,你需要使用SetWindowsHookEx與WH_CALLWNDPROC掛鉤主線程,查找WM_CLOSE並採取行動/信號的線程關閉。

+0

謝謝,嘗試,聽起來像我一直在尋找:) – Omer

+0

它沒有工作得很好,我設法掛鉤和接收線程的消息。但是,我沒有收到WM_QUIT消息,只有WM_DESTROY和WM_NCDESTROY,它們都與Windows相關聯。 – Omer

+0

要了解WM_QUIT,WH_CALLWNDPROC是錯誤的鉤子類型(因爲窗口過程不會用WM_QUIT調用)。您需要使用WH_GETMESSAGE掛鉤來了解WM_QUIT。 –

4

該進程沒有線索存在的線索,它不會在乎它是否退出很好。事實上,如果程序寫入C中,它將終止它,它的運行時庫在其main()方法退出時調用TerminateProcess。 Harikiri風格。

如果你外部關心線程,比如在你編寫的監控線程的程序中,那麼你需要在退出時留下面包屑。或者通過使用任何進程互操作機制將其傳遞給程序,如命名管道。或者通過設置一個命名的事件。確保你處理harikiri場景,你還需要檢查進程句柄是否有信號表明它已經終止。

+0

謝謝,但我需要關注它的內部,我會嘗試cprogrammer的解決方案。 – Omer