我怎么能长时间转到HWND(C++ visual studio 8)?
Long lWindowHandler; HWND oHwnd = (HWND)lWindowHandler;
但是我得到了以下警告:
警告C4312:'type cast':从'LONG'转换为更大尺寸的'HWND'
谢谢.
只要你确定你拥有的LONG真的是一个HWND,它就像下面这样简单:
HWND hWnd = (HWND)(LONG_PTR)lParam;
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位应用程序,则可以忽略它们.
如果您没有在64位版本的Windows上运行,那么这样做是唯一安全的.LONG类型是32位,但HANDLE类型可能是64位.你需要让你的代码干净64位.简而言之,您需要将LONG更改为LONG_PTR.
使用指针类型的规则:
不要将指针强制转换为int,long,ULONG或DWORD.如果必须转换指针以测试某些位,设置或清除位或以其他方式操作其内容,请使用UINT_PTR或INT_PTR类型.这些类型是整数类型,可扩展为32位和64位Windows的指针大小(例如,对于32位Windows为ULONG,对于64位Windows为_int64).例如,假设您正在移植以下代码:
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上的错误.