我需要在应用程序启动之后和退出之前执行某些操作(使用UMDH进行某种自动内存泄漏检测)。
我已经准备好了DLL,它被注入到所有进程和DLL_PROCESS_ATTACH我正在执行我的第一个操作(就在应用程序启动之后) - 所以我的问题的这一部分已经解决了。
问题在于第二部分 - 当进程即将退出时执行操作。
我在DLL_PROCESS_DETACH中尝试过,但为时已晚,我需要先挂钩。
使用Windows Hooks机制,我已经迷上了WH_GETMESSAGE:
hhk = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) &GetMsgProc, NULL , GetCurrentThreadId());
和GetMsgProc()函数:
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode == HC_ACTION )
{
PMSG msg = (PMSG) lParam;
if( msg->message == WM_CLOSE )
{
OutputDebugString(L"WM_CLOSE");
}
if( msg->message == WM_QUIT )
{
OutputDebugString(L"WM_QUIT");
}
if( msg->message == WM_DESTROY )
{
OutputDebugString(L"WM_DESTROY");
}
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}
但是使用这种方法,我只检测WM_CLOSE消息(当我使用“X”按钮关闭应用程序时)。我不知道为什么我没有检测到WM_QUIT消息,从不。
任何想法,如何在应用程序即将退出时执行某些操作?
(我知道Detours,但不能在我的项目中使用它们......)
答案 0 :(得分:0)
除WH_CALLWNDPROC
外,请尝试WH_GETMESSAGE
。因此,当您收到主应用程序窗口的WM_DESTROY
时 - 这可能是一面旗帜。
我认为,理想情况下,您必须覆盖主应用程序窗口的窗口过程(如果可能)。 Smth喜欢
WM_QUIT
消息。当GetMessage
看到WM_QUIT
时,它会返回FALSE
。所以,这可能就是问题所在。您可以尝试更改IAT表(导入)以覆盖GetMessage [A / W]过程。
WNDPROC gpfnOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)YourWndProc);