Вопрос

Как я могу использовать 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-битных окнах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top