1

我需要在应用程序启动之后和退出之前执行一些操作(某种使用 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,但不能在我的项目中使用它们......)

4

1 回答 1

1
  1. 尝试WH_CALLWNDPROCWH_GETMESSAGE. 因此,当您收到WM_DESTROY主应用程序窗口时 - 这可能是一个标志。

  2. 我认为,理想情况下,您必须覆盖主应用程序窗口的窗口过程(如果可能的话)。喜欢

  3. WM_QUIT消息不被窗口过程处理。当GetMessage看到WM_QUIT它返回时FALSE。所以,可能这就是问题所在。您可以尝试更改 IAT 表(导入)以覆盖 GetMessage[A/W] 过程。

    WNDPROC gpfnOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)YourWndProc);
    
于 2012-07-25T18:33:51.930 回答