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

7

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

我想要正确地退出线程,即发布一个退出消息(PostThreadMessage),然后等待它(WaitForSingleObject)。

我应该在哪里等待这个线程关闭呢?我不能在DLL_PROCESS_DETACH上这样做,因为那时所有线程都已关闭或终止,并且我不知道进程何时即将关闭。

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

我很乐意听取任何其他想法或解决方案。

编辑:
尝试使用WH_CALLWNDPROC和SetWindowsHookEx钩住主线程,但效果不太好,我设法钩住并接收了线程的消息。 但是,我没有收到WM_QUIT消息,只有WM_DESTROY和WM_NCDESTROY,它们都与窗口相关。

谢谢,
Omer

2个回答

4
该进程并不知道该线程的存在,它不会关心它是否正常退出。实际上,如果程序是用C语言编写的,当其main()方法退出时,其运行库将调用TerminateProcess终止它。这种方式称为切腹式。
如果您在外部关心该线程,比如在一个监控该线程的程序中,那么您需要在线程退出时留下一个“面包屑”。可以通过使用任何进程互操作机制(如命名管道)与您的程序通信来实现这一点。或者通过设置命名事件。请确保处理好切腹式的情况,您还需要检查进程句柄是否被标记以指示它已终止。

谢谢,但我需要在内部处理它,我会尝试cprogrammer的解决方案。 - Omer

3
如果您需要在“即将关闭”时执行某些操作,需要使用SetWindowsHookEx钩住主线程,使用WH_CALLWNDPROC查找WM_CLOSE并采取行动/发出线程关闭信号。

谢谢,我试试看,听起来正是我一直在寻找的 :) - Omer
它并没有完全正常工作,我设法钩取并接收了线程的消息。然而,我只能接收到WM_DESTROY和WM_NCDESTROY消息,而无法接收WM_QUIT消息,它们都与窗口相关。 - Omer
要注意WM_QUIT消息,使用WH_CALLWNDPROC钩子是错误的(因为窗口过程不会被调用以处理WM_QUIT)。您需要使用WH_GETMESSAGE钩子来注意WM_QUIT消息。 - Logan Capaldo
@Logan - 使用了WH_GETMESSAGE,但仍然有一些进程没有返回WM_QUIT。 - Omer
使用 Spy++ 查看窗口是否使用 WM_CLOSE。你要找的是 WM_CLOSE 而不是 WM_QUIT。 - cprogrammer
请注意,这完全取决于您要注入的程序的设计。明显的反例是,一个具有多个窗口的程序可能会收到WM_CLOSE消息,即使它并没有准备退出。没有通用解决方案。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接