如何在注入的DLL中正确终止工作线程?

时间:2011-06-23 11:10:10

标签: c++ windows multithreading winapi dll

我正在向某个进程注入一个DLL,该DLL有一个正在运行消息循环的工作线程。

我想正确退出线程,即发布退出消息(PostThreadMessage)并等待它(WaitForSingleObject)。

我可以在哪里等待这个帖子关闭?我无法在DLL_PROCESS_DETACH上执行此操作,因为此时所有线程都已关闭或终止,我不知道该进程何时即将关闭。

我唯一的想法是,有没有办法拦截主线程消息循环并寻找WM_CLOSE \ DESTROY消息?

我很想听到任何其他想法\解决方案。

编辑:
尝试使用带有WH_CALLWNDPROC的SetWindowsHookEx挂钩主线程,但它没有很好地工作,我设法挂钩并接收线程的消息。但是,我没有收到WM_QUIT消息,只有WM_DESTROY和WM_NCDESTROY,它们都与windows相关联。

谢谢,
奥马尔

2 个答案:

答案 0 :(得分:4)

该进程不知道线程是否存在,它不关心它是否退出。实际上,如果程序是用C编写的,它会终止它,当它的main()方法退出时,它的运行时库调用TerminateProcess。 Harikiri风格。

如果你外部关心线程,比如在你编写的监控线程的程序中,那么你需要在退出时留下一个痕迹。通过使用您使用的任何进程互操作机制将其传递给您的程序,如命名管道。或者通过设置命名事件。确保您处理harikiri场景,您还需要检查进程句柄是否已发出信号以指示它已终止。

答案 1 :(得分:3)

如果您需要对“About-To-Close”执行某些操作,则需要使用SetWindowsHookEx将主线程挂钩到WH_CALLWNDPROC并查找WM_CLOSE并执行操作/发出关闭线程的信号。