题
如何将 long 转换为 HWND (C++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
但我收到以下警告:
警告 C4312:'类型转换':从“LONG”转换为更大尺寸的“HWND”
谢谢。
解决方案 2
HWND 是窗口句柄。该类型在 WinDef.h 中声明如下:
typedef HANDLE HWND;
HANDLE 是对象的句柄。该类型在 WinNT.h 中声明如下:
typedef PVOID 句柄;
最后,PVOID 是一个指向任意类型的指针。该类型在 WinNT.h 中声明如下:
typedef 无效 *PVOID;
所以,HWND实际上是一个指向void的指针。您可以像这样将 long 转换为 HWND:
HWND h = (HWND)my_long_var;
但要非常小心 my_long_var 中存储的信息。你必须确保那里有一个指针。
稍后编辑:该警告表明您已打开 64 位可移植性检查。如果您正在构建 32 位应用程序,则可以忽略它们。
其他提示
只要您确定您拥有的 LONG 确实是 HWND,那么它就很简单:
HWND hWnd = (HWND)(LONG_PTR)lParam;
仅当您运行的不是 64 位版本的 Windows 时,这样做才是安全的。LONG类型是32位,但是HANDLE类型可能是64位。您需要使您的代码 64 位干净。简而言之,您需要将 LONG 更改为 LONG_PTR。
不要将指针施加给int,long,ulong或dword。如果您必须施放指针以测试一些位,设置或清除位或以其他方式操纵其内容,请使用UINT_PTR或INT_PTR类型。这些类型是不可或缺的类型,可扩展到32位和64位窗口的指针的大小(例如,用于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的类型上。
请注意,将手柄定义为一个void*,因此将手柄值打字到ulong值以测试,设置或清除低阶2位是64位窗口上的错误。