Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Корректная передача DWORD в CreateThread

21.06.2021, 08:57. Показов 3547. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код

C++
1
2
3
4
5
6
DWORD WINAPI messageDispatcher(LPVOID thread)
{
    hookHandle = SetWindowsHookEx(WH_MOUSE, messageHandler, GetModuleHandle(nullptr), reinterpret_cast<DWORD>(thread));
 
    // Бла бла
}
C++
1
2
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" большего размера


Как сделать правильно?

Добавлено через 10 минут
Нужно чтобы этот код корректно работал как на x32 так и на x64 системах
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2021, 08:57
Ответы с готовыми решениями:

Корректная передача данных на сервер
Алоха, всем кому не все равно! Мучаюсь в рамках данной темы, надеюсь найду на форуме поддержку. Раньше программировал игры на...

Корректная передача строкового параметра в функцию
Доброго, с места в карьер, объясните мне, недалекому, пожалуйста, почему вот это работает: &lt;!DOCTYPE html&gt; &lt;html&gt; ...

не корректная передача option value в POST HTML+JS
Всем привет, подскажите пож-та, не корректно передаются данные из option value (сейчас передаются данные которые стоят по умолчанию в...

8
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.06.2021, 10:42
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

в CreateThread нужно передать не идентификатор потока, а его хендл (OpenThread)
а в SetWindowsHookEx воспользоваться функцией GetThreadId
C++
1
2
3
4
5
6
7
DWORD WINAPI messageDispatcher(LPVOID thread)
{
 
    hookHandle = SetWindowsHookEx(WH_MOUSE, messageHandler, GetModuleHandle(nullptr), GetThreadId(thread));
 
    // Бла бла
}
C++
1
2
3
DWORD thread = GetWindowThreadProcessId(window, nullptr);
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, thread);
CreateThread(nullptr, 0, messageDispatcher, hThread, 0, nullptr);
2
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.06.2021, 10:55  [ТС]
_lunar_, Вроде-бы работает и предупреждений нет, спасибо! А это будет работать корректно и на x32 системах? Почему именно передача хендла?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.06.2021, 11:03
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
А это будет работать корректно и на x32 системах?
да будет.
но для x32 ОС компилировать нужно соответственно в x32.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Почему именно передача хендла?
аргумент в функции CreateThread
C++
1
_In_opt_ __drv_aliasesMem LPVOID lpParameter,
является типом LPVOID
C++
1
typedef void far *LPVOID;
указателем на объект.
DWORD это целочисленный тип, но не как не ссылка.

к тому же сам хендл является указателем на void
C++
1
typedef void *HANDLE;
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.06.2021, 11:11  [ТС]
_lunar_, Код на создание потока находится в DllMain в DLL_PROCESS_ATTACH, с этим не должно быть проблем? Вдруг HANDLE уничтожится до того как выполнится SetWindowsHookEx?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.06.2021, 11:16
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
с этим не должно быть проблем?
думаю нет.
по тестируйте отладчиком, посмотрите поведение потока.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Вдруг HANDLE уничтожится до того как выполнится SetWindowsHookEx?
как вариант сделать проверку на наличие процесса и его потоков.
вряд ли рядовой процесс сможет самостоятельно прибить чужой поток.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.06.2021, 11:29  [ТС]
_lunar_, Я имею ввиду, вдруг указатель на поток уничтожится до того как выполнится SetWindowsHookEx так как он находится в DllMain, а DllMain просто создает поток и возвращает TRUE. C++ ведь память сам подчищает, а раз DllMain выполнился, то по логике, он должен и HANDLE который был получен вызовом OpenThread почистить..
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.06.2021, 12:25
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
C++ ведь память сам подчищает, а раз DllMain выполнился, то по логике, он должен и HANDLE который был получен вызовом OpenThread почистить..
это какое-то заблуждение.
ничего там не подчищается, это не шарп.
если в коде нет функции закрытия хендла, он так и останется открытым (в некоторых случаях перейдёт в статус зомби-процесса).

основное для объекта ядра это его идентификатор.
можно открыть сколько угодно хендлов одного и того же идентификатора потока.
пока существует идентификатор, существует и хендл.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
21.06.2021, 12:57  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
ничего там не подчищается, это не шарп.
Я думал что хендлы, это как переменные в C++, которые уничтожаются когда выходят из области видимости..

Добавлено через 3 минуты
Мне нужно ещё многому научиться, ещё раз спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2021, 12:57
Помогаю со студенческими работами здесь

Что такое HDC hdc? const POINT *lppt? const DWORD *lpdwPolyPoints? DWORD cCount?
Подскажите: BOOL PolyPolyline( _In_ HDC hdc, _In_ const POINT *lppt, _In_ const DWORD *lpdwPolyPoints, _In_ DWORD...

CreateThread
Есть функция: void one() { while(1) { cout &lt;&lt; &quot;1&quot;; } }

CreateThread
Пишу такой код: //--------------------------------------------------------------------------- DWORD WINAPI ThreadFunc(LPVOID P) { ...

CreateThread
Есть процедура TForm1.URLVSLIST(URL: String; List: TsListView): string; при ее выполнении программа напрочь зависает до окончания...

CreateThread
Как можно управлять потоком созданным с помощью *СоздатьПоток*? -как изменить приоритет -как его уничтожить или остановить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru