如何将 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位窗口上的错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top