Передача DWORD в CreateThread

Есть следующий код

DWORD WINAPI messageDispatcher(LPVOID thread)
{
    hookHandle = SetWindowsHookEx(WH_MOUSE, messageHandler, GetModuleHandle(nullptr), reinterpret_cast<DWORD>(thread));
 
    // Бла бла
}

DWORD thread = GetWindowThreadProcessId(window, nullptr);
CreateThread(nullptr, 0, messageDispatcher, reinterpret_cast<LPVOID>(thread), 0, nullptr);

При компиляции Visual Studio выдает предупреждения

  • warning C4311: reinterpret_cast: усечение указателя из "LPVOID" в "DWORD"
  • warning C4302: reinterpret_cast: усечение из "LPVOID" к "DWORD"
  • warning C4312: reinterpret_cast: преобразование из "DWORD" в "LPVOID" большего размера

Мне нужно передать идентификатор нужного мне потока в мой поток для того чтобы установить перехват событий мыши. Код должен работать корректно как на x32 системах так и на x64 (при соответствующей компиляции под x32 и x64 естественно) Как сделать правильно?


Ответы (1 шт):

Автор решения: AlexGlebe

Передаёте указатель на идентификатор нити. Этот идентификатор должен быть в статической переменной (не в стеке), чтобы поток успел взять его значение.

CreateThread ( nullptr , 0 , messageDispatcher ,
  reinterpret_cast < LPVOID > ( & thread ) , 0 , nullptr ) ;

Преобразоваете на правильный указатель и берёте с него значение.

DWORD WINAPI messageDispatcher ( LPVOID threadp )
{
  hookHandle = SetWindowsHookEx ( WH_MOUSE , messageHandler , 
    GetModuleHandle ( nullptr ) ,
    * reinterpret_cast < DWORD * > ( threadp ) ) ;
→ Ссылка