2008-09-18 3 views
7

Как я могу использовать long для HWND (C++ visual studio 8)?долгое время для HWND (VS8 C++)

Long lWindowHandler; 
HWND oHwnd = (HWND)lWindowHandler; 

Но я получил следующее предупреждение:

предупреждение C4312: 'тип произнесения': преобразование из 'LONG' до 'HWND' большего размера

Спасибо.

ответ

8

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

typedef HANDLE HWND;

HANDLE - это ручка для объекта. Этот тип заявлен в WinNT.h следующим образом:

typedef PVOID HANDLE;

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

typedef void * PVOID;

Итак, HWND на самом деле является указателем на пустоту. Вы можете сделать длинный HWND следующим образом:

HWND h = (HWND) my_long_var;

, но очень осторожно, какая информация хранится в my_long_var. Вы должны убедиться, что у вас есть указатель.

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

9

Пока вы будете уверены, что долго вы на самом деле является HWND, то это так же просто, как:

HWND hWnd = (HWND)(LONG_PTR)lParam; 
+0

Спасибо за ваш ответ. Я пробовал это и получил предупреждение: предупреждение C4312: 'тип cast': преобразование из 'LONG' в 'HWND' большего размера любые предложения? Спасибо. – 2008-09-18 06:34:48

+1

Я думаю, что это лучший ответ: `(HWND) long_ver` не работает для меня! – ehsun7b 2012-02-14 10:30:42

5

Выполнение этого возможно только в том случае, если вы не работаете в 64-разрядной версии окон. Тип LONG - 32 бита, но тип HANDLE - это, вероятно, 64 бит. Вам нужно сделать свой код 64-битным. Короче говоря, вы захотите изменить LONG на LONG_PTR.

:

Не отвергни указатели на Int, длинные, ULONG или DWORD. Если вы должны указать указатель для проверки некоторых битов, установите или очистите бит или иным образом обработайте его содержимое, используйте UINT_PTR или INT_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 где уместно (и если вы не уверены требуются ли они, нет вреда в использовании их на всякий случай). Do не набрасывает указатели на типы ULONG, LONG, INT, UINT или DWORD.

Обратите внимание, что HANDLE определяется как пустот *, поэтому типажей значение HANDLE до значения ULONG, чтобы проверить, установить или четкие низкого порядка 2 бита ошибка на 64-битной Windows.

Смежные вопросы