长到HWND(VS8 C ++)

时间:2008-09-18 06:24:52

标签: casting long-integer hwnd

如何将长时间转换为HWND(C ++ visual studio 8)?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

但是我收到了以下警告:

  

警告C4312:'type cast':从'LONG'转换为更大尺寸的'HWND'

感谢。

3 个答案:

答案 0 :(得分:9)

只要你确定你拥有的LONG真的是一个HWND,那就简单了:

HWND hWnd = (HWND)(LONG_PTR)lParam;

答案 1 :(得分:8)

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位应用程序,则可以忽略它们。

答案 2 :(得分:6)

如果您没有在64位版本的Windows上运行,那么这样做是安全的。 LONG类型是32位,但HANDLE类型可能是64位。你需要让你的代码干净64位。简而言之,您需要将LONG更改为LONG_PTR。

Rules for using pointer types

  

不要将指针强制转换为int,long,   ULONG,或DWORD。如果你必须施展   指针测试一些位,设置或   清除位或以其他方式操纵   其内容,使用UINT_PTR或   INT_PTR类型。这些类型是不可或缺的   缩放到a的大小的类型   32位和64位指针   Windows(例如,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。

     

请注意,HANDLE定义为a   void *,因此类型化HANDLE值   到ULONG值来测试,设置或   清除低位2位是一个错误   在64位Windows上。