долго до HWND (VS8 C ++) - PullRequest
       24

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

7 голосов
/ 18 сентября 2008

Как я могу долго приводить в HWND (C ++ visual Studio 8)?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

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

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

Спасибо.

Ответы [ 3 ]

9 голосов
/ 18 сентября 2008

Пока вы уверены, что ДОЛГО у вас есть действительно HWND, то это так просто, как:

HWND hWnd = (HWND)(LONG_PTR)lParam;
8 голосов
/ 18 сентября 2008

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

typedef HANDLE HWND;

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

typedef PVOID HANDLE;

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

typedef void * PVOID;

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

HWND h = (HWND) my_long_var;

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

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

6 голосов
/ 18 сентября 2008

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

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

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

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

...