долго до HWND (VS8 C++)
-
01-07-2019 - |
Вопрос
Как я могу использовать HWND (C++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Но я получил следующее предупреждение:
предупреждение C4312:'приведение типов':преобразование из «LONG» в «HWND» большего размера
Спасибо.
Решение 2
HWND — это дескриптор окна.Этот тип объявлен в WinDef.h следующим образом:
определение типа HANDLE HWND;
HANDLE — дескриптор объекта.Этот тип объявлен в WinNT.h следующим образом:
typedef PVOID HANDLE;
Наконец, PVOID — это указатель на любой тип.Этот тип объявлен в WinNT.h следующим образом:
typedef void *PVOID;
Итак, HWND на самом деле является указателем на void.Вы можете передать длинное значение HWND следующим образом:
HWND ч = (HWND)my_long_var;
но очень внимательно относитесь к тому, какая информация хранится в my_long_var.Вы должны убедиться, что у вас есть указатель.
Позже отредактирую:Предупреждение предполагает, что у вас включены проверки переносимости 64-битной версии.Если вы создаете 32-битное приложение, вы можете их игнорировать.
Другие советы
Если вы уверены, что имеющийся у вас LONG действительно является HWND, то это так же просто, как:
HWND hWnd = (HWND)(LONG_PTR)lParam;
Это безопасно только в том случае, если вы используете не 64-битную версию Windows.Тип LONG имеет длину 32 бита, а тип HANDLE, вероятно, составляет 64 бита.Вам нужно будет сделать свой 64-битный код чистым.Короче говоря, вам нужно изменить LONG на LONG_PTR.
Правила использования типов указателей:
Не поднимайте указатели на Int, Long, Ulong или DWORD.Если вам необходимо сформулировать указатель, чтобы проверить некоторые биты, установить или очистить биты или иным образом манипулировать его содержимым, используйте тип uint_ptr или int_ptr.Эти типы являются интегральными типами, которые масштабируются до размера указателя как для 32-, так и 64-битных окон (например, Ulong для 32-битных Windows и _int64 для 64-битных окон).Например, предположим, что вы переносите следующий код:
ImageBase = (Pvoid) ((Ulong) ImageBase | 1);
Как часть процесса порта, вы измените код следующим образом:
ImageBase = (Pvoid) (((ulong_ptr) ImageBase | 1);
Используйте uint_ptr и int_ptr, где это необходимо (и если вы не уверены, требуются ли они, в случае их использования нет вреда).Не бросайте свои указатели на типы Ulong, Long, Int, Uint или DWORD.
Обратите внимание, что ручка определяется как void*, поэтому типизирование значения ручки до значения Ulong для тестирования, установки или очистки битов низкого порядка 2-это ошибка на 64-битных окнах.