Нарушение прав доступа при отправке WM_QUIT через PostThreadMessage - PullRequest
0 голосов
/ 15 мая 2018

Я хочу, чтобы определенный поток перестал работать. Функция потока выглядит следующим образом:

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);
   } 
} 

Кто-нибудь сталкивался с этой проблемой раньше?

1 Ответ

0 голосов
/ 15 мая 2018
LPMSG msg = { 0 };

Объявляет указатель на структуру MSG.Затем вы передаете этот указатель на GetMessage, но не выделяете фактическую структуру MSG для указателя, на который нужно указать.

Замените

LPMSG msg = { 0 };

на

MSG msg;

, который выделяет структуру MSG.Затем вызовите GetMessage следующим образом

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

, передав адрес этой структуры MSG.

...