Передача 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 ) ) ;