【问题标题】:Access violation when sending WM_QUIT via PostThreadMessage通过 PostThreadMessage 发送 WM_QUIT 时访问冲突
【发布时间】:2023-04-02 10:06:01
【问题描述】:

我想让某个线程停止工作。线程函数如下:

unsigned __stdcall keyloggingmanager::RunKeyLogger(void * args) {

    UNREFERENCED_PARAMETER(args);
    wcout << "RunKeyLogger Thread Started !" << endl;
    HINSTANCE appInstance = NULL;
    HHOOK _keyboardHook = NULL;
    appInstance = GetModuleHandle(NULL); // getting the current module handle
    _keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, ThisObj->KeyPressHandler, appInstance, GLOBAL_HOOK); // setting the hook.
    LPMSG msg = { 0 };
    while (GetMessage(msg, NULL, 0, 0) != 0)
    {
        TranslateMessage(msg);
        DispatchMessage(msg);
    }

    cout << "Got WM_QUIT, aborting...\n";
    UnhookWindowsHookEx(_keyboardHook);
    if (_keyboardHook == NULL) {
        wcout << L"UNABLE TO HOOK" << endl; 
    }
    else if(appInstance == NULL)
    {
        wcout << L"UNABLE TO GET MODULE HANDLE" << endl;
    }
    return 0;
 }

用于停止线程的行如下:

PostThreadMessage(AboveThreadId, (UINT)WM_QUIT, NULL, NULL);

我使用此方法遇到访问冲突异常。 我尝试了几种变体,例如:

while ( GetMessage(msg, hWnd, 0, 0) )
{
   if ( msg->message == WM_QUIT )
   {
       break;
   }
   else
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   } 
} 

以前有人遇到过这个问题吗?

【问题讨论】:

  • 我认为 WM_QUIT 是为了退出应用程序。我不确定是否有任何副作用。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 它说这条消息导致 GetMessage 函数返回 0,这是我的 while 条件。 @Stefan
  • 使用调试器和/或发布一个最小的、可验证的和完整的示例。
  • 如果您发布的代码是您的实际代码,则您将一个空指针传递给GetMessage()。您需要将其指向 MSG 结构的实际实例。
  • 不知道这是否会导致问题,但我注意到您将wcoutconst char* 混合在一起,例如在wcout &lt;&lt; "RunKeyLogger ..."

标签: c++ multithreading winapi message-queue


【解决方案1】:
LPMSG msg = { 0 };

这声明了一个指向MSG 结构的指针。然后将该指针传递给GetMessage,但不要为指向的指针分配实际的MSG 结构。

替换

LPMSG msg = { 0 };

MSG msg;

它分配了一个MSG 结构。然后像这样调用GetMessage

while ( GetMessage(&msg, NULL, 0, 0) )

传递MSG 结构的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多