长到HWND(VS8 C++)

7 casting hwnd long-integer

我怎么能长时间转到HWND(C++ visual studio 8)?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下警告:

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

谢谢.

Rog*_*mbe 9

只要你确定你拥有的LONG真的是一个HWND,它就像下面这样简单:

HWND hWnd = (HWND)(LONG_PTR)lParam;
Run Code Online (Sandbox Code Playgroud)


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


180*_*ION 6

如果您没有在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上的错误.

  • 虽然您的建议对于指针是正确的,但请参阅 [this answer on handle lengths](http://stackoverflow.com/a/29526711/2636001)(或 [相应的 MSDN 文章](https://msdn.microsoft.com/ en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx))– `HWND` 仅使用最低 32 位,因此跨进程边界是安全的。 (2认同)