如何将长时间转换为HWND(C ++ visual studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
但是我收到了以下警告:
警告C4312:'type cast':从'LONG'转换为更大尺寸的'HWND'
感谢。
答案 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上。