долго к HWND (VS8 C++)

Самая важная причина не использовать их в том, что ES6 не поддерживается во всех средах.

Конечно, это может не повлиять на вас вообще, но все же: YAGNI . Не используйте шаблонные литералы, если вам не нужна интерполяция, многострочные литералы или неограниченные кавычки и апострофы. Большая часть аргументов из . Когда использовать двойные или одинарные кавычки в JavaScript? , переносятся также. Как всегда, сохраните свою базу кода согласованной и используйте только один строковый литерал, в котором вам не нужен специальный.

7
задан 18 September 2008 в 06:42
поделиться

3 ответа

HWND является дескриптором к окну. Этот тип объявляется в WinDef.h следующим образом:

ДЕСКРИПТОР определения типа HWND;

ДЕСКРИПТОР является дескриптором к объекту. Этот тип объявляется в WinNT.h следующим образом:

определение типа ДЕСКРИПТОР PVOID;

Наконец, PVOID является указателем на любой тип. Этот тип объявляется в WinNT.h следующим образом:

определение типа пусто *PVOID;

Так, HWND является на самом деле указателем на пустоту. Можно бросить длинное к HWND как это:

HWND h = (HWND) my_long_var;

но очень остерегающийся того, какая информация хранится в my_long_var. Необходимо удостовериться, что у Вас есть указатель там.

Более позднее редактирование: предупреждение предлагает, чтобы Вам включили 64-разрядные проверки мобильности. Если Вы создаете приложение на 32 бита, можно проигнорировать их.

8
ответ дан 6 December 2019 в 07:53
поделиться

Пока Вы уверены, что ДЛИННЫМ, который Вы имеете, является действительно HWND, затем это столь же просто как:

HWND hWnd = (HWND)(LONG_PTR)lParam;
9
ответ дан 6 December 2019 в 07:53
поделиться

Выполнение, которое только безопасно, если Вы не работаете на версии на 64 бита окон. ДЛИННЫЙ тип составляет 32 бита, но тип ДЕСКРИПТОРА - вероятно, 64 бита. Необходимо будет сделать код 64 битами чистый. Короче говоря, Вы захотите изменить ДЛИННОЕ на LONG_PTR.

Правила для использования типов указателей:

Не бросайте указатели на интервал, долго, ULONG или DWORD. Если необходимо бросить указатель, чтобы протестировать некоторые биты, установить или очистить биты или иначе управлять его содержанием, используйте тип INT_PTR или UINT_PTR. Эти типы являются целочисленными типами, которые масштабируются к размеру указателя и для 32-и для 64-разрядный Windows (например, ULONG для 32-разрядного Windows и _int64 для 64-разрядного Windows). Например, предположите портирование следующего кода:

ImageBase = (PVOID) ((ULONG) ImageBase | 1);

Как часть процесса портирования, Вы изменили бы код следующим образом:

ImageBase = (PVOID) ((ULONG_PTR) ImageBase | 1);

Используйте UINT_PTR и INT_PTR в соответствующих случаях (и если Вы не уверены, требуются ли они, нет никакого вреда в использовании их на всякий случай). Не бросайте свои указатели на типы ULONG, ДОЛГО, INT, UINT или DWORD.

Обратите внимание, что ДЕСКРИПТОР определяется как пустота*, таким образом преобразовывание тип ДЕСКРИПТОРА оценивает ULONG, оценивают тесту, устанавливают или очищают младший разряд, 2 бита являются ошибкой в 64-разрядном Windows.

6
ответ дан 6 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: