当前位置:  开发笔记 > 开发工具 > 正文

长到HWND(VS8 C++)

如何解决《长到HWND(VS8C++)》经验,为你挑选了3个好方法。

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

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

但是我得到了以下警告:

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

谢谢.



1> Roger Lipsco..:

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

HWND hWnd = (HWND)(LONG_PTR)lParam;



2> 小智..:

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



3> 1800 INFORMA..:

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

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有