7

如何将 long 转换为 HWND(C++ Visual Studio 8)?

Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;

但我收到以下警告:

警告 C4312:“类型转换”:从“LONG”转换为更大尺寸的“HWND”

谢谢。

4

3 回答 3

10

只要您确定您拥有的 LONG 确实是 HWND,那么它就很简单:

HWND hWnd = (HWND)(LONG_PTR)lParam;
于 2008-09-18T06:31:25.867 回答
8

HWND 是窗口句柄。此类型在 WinDef.h 中声明如下:

typedef 处理 HWND;

HANDLE 是对象的句柄。此类型在 WinNT.h 中声明如下:

typedef PVOID 句柄;

最后,PVOID 是指向任何类型的指针。此类型在 WinNT.h 中声明如下:

类型定义无效*PVOID;

所以,HWND 实际上是一个指向 void 的指针。您可以像这样将 long 转换为 HWND:

HWND h = (HWND)my_long_var;

但要非常小心 my_long_var 中存储了哪些信息。您必须确保那里有一个指针。

稍后编辑:警告表明您已打开 64 位可移植性检查。如果您正在构建一个 32 位应用程序,您可以忽略它们。

于 2008-09-18T06:37:55.150 回答
6

仅当您不在 64 位版本的 Windows 上运行时,这样做才是安全的。LONG 类型是 32 位,但 HANDLE 类型可能是 64 位。您需要使您的代码 64 位干净。简而言之,您需要将 LONG 更改为 LONG_PTR。

使用指针类型的规则

不要将指针强制转换为 int、long、ULONG 或 DWORD。如果必须强制转换指针来测试某些位、设置或清除位或以其他方式操作其内容,请使用 UINT_PTR 或 INT_PTR 类型。这些类型是整数类型,可以缩放到 32 位和 64 位 Windows 的指针大小(例如,ULONG 用于 32 位 Windows,_int64 用于 64 位 Windows)。例如,假设您要移植以下代码:

ImageBase = (PVOID)((ULONG)ImageBase | 1);

作为移植过程的一部分,您将更改代码如下:

ImageBase = (PVOID)((ULONG_PTR)ImageBase | 1);

在适当的情况下使用 UINT_PTR 和 INT_PTR(如果您不确定是否需要它们,使用它们以防万一)。不要将指针转换为 ULONG、LONG、INT、UINT 或 DWORD 类型。

Note that HANDLE is defined as a void*, so typecasting a HANDLE value to a ULONG value to test, set, or clear the low-order 2 bits is an error on 64-bit Windows.

于 2008-09-18T07:13:18.607 回答