long to HWND (VS8 C++)

7
我该如何将long转换为HWND(C++ visual studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

但我收到了以下警告:

警告 C4312:'type cast':从较大的大小的 'LONG' 转换为 'HWND'

谢谢。

3个回答

10
只要你确定你所拥有的LONG变量确实是一个HWND句柄,那么代码就很简单了:

只要你确定你所拥有的 LONG 变量确实是一个 HWND 句柄,那么代码就很简单了:

HWND hWnd = (HWND)(LONG_PTR)lParam;

谢谢您的回复。 我尝试了一下,但是收到了一个警告: warning C4312: 'type cast' : conversion from 'LONG' to 'HWND' of greater size 您有什么建议吗? 谢谢。 - Abc Stuff
1
我认为这是最好的答案,“(HWND) long_ver” 对我不起作用! - ehsun7b

8
HWND是一个窗口句柄。该类型在WinDef.h中声明如下:
typedef HANDLE HWND;
HANDLE是一个对象句柄。该类型在WinNT.h中声明如下:
typedef PVOID HANDLE;
最后,PVOID是任意类型的指针。该类型在WinNT.h中声明如下:
typedef void *PVOID;
因此,HWND实际上是一个void指针。您可以像这样将long转换为HWND:
HWND h = (HWND)my_long_var;
但要非常小心存储在my_long_var中的信息。您必须确保其中有一个指针。
稍后编辑: 警告表明您已打开64位可移植性检查。如果您正在构建32位应用程序,则可以忽略它们。

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上的错误。

2
虽然您的建议对于指针是正确的,但请参阅此答案中有关句柄长度的内容(或相应的MSDN文章)- HWND仅使用最低的32位,因此在跨进程边界时是安全的。 - dst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接