【发布时间】:2010-09-10 13:38:42
【问题描述】:
如何将 long 转换为 HWND (C++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
但我收到以下警告:
警告 C4312:“类型转换”:从“LONG”转换为更大尺寸的“HWND”
谢谢。
【问题讨论】:
标签: casting long-integer hwnd
如何将 long 转换为 HWND (C++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
但我收到以下警告:
警告 C4312:“类型转换”:从“LONG”转换为更大尺寸的“HWND”
谢谢。
【问题讨论】:
标签: casting long-integer hwnd
只要你确定你拥有的 LONG 确实是一个 HWND,那么它就这么简单:
HWND hWnd = (HWND)(LONG_PTR)lParam;
【讨论】:
(HWND) long_ver 不适合我!
HWND 是窗口句柄。 该类型在 WinDef.h 中声明如下:
typedef HANDLE HWND;
HANDLE 是对象的句柄。 该类型在 WinNT.h 中声明如下:
typedef PVOID 句柄;
最后,PVOID 是一个指向任何类型的指针。 该类型在 WinNT.h 中声明如下:
typedef void *PVOID;
所以,HWND 实际上是一个指向 void 的指针。您可以像这样将 long 转换为 HWND:
HWND h = (HWND)my_long_var;
但要非常小心 my_long_var 中存储了哪些信息。您必须确保那里有一个指针。
后期编辑: 该警告表明您已打开 64 位可移植性检查。如果您正在构建一个 32 位应用程序,您可以忽略它们。
【讨论】:
仅当您不是在 64 位版本的 Windows 上运行时,这样做才是安全的。 LONG 类型是 32 位,但 HANDLE 类型可能是 64 位。您需要使您的代码 64 位干净。简而言之,您需要将 LONG 更改为 LONG_PTR。
Rules for using pointer types:
不要将指针转换为 int、long、 ULONG 或 DWORD。如果你必须施放一个 测试一些位的指针,设置或 清除位,或以其他方式操纵 它的内容,使用 UINT_PTR 或 INT_PTR 类型。这些类型是不可或缺的 缩放到 a 大小的类型 32 位和 64 位指针 Windows(例如,ULONG 表示 32 位 64 位的 Windows 和 _int64 视窗)。例如,假设您是 移植以下代码:
ImageBase = (PVOID)((ULONG)ImageBase | 1);
作为移植过程的一部分,您 将代码更改如下:
图像库 = (PVOID)((ULONG_PTR)ImageBase | 1);
在哪里使用 UINT_PTR 和 INT_PTR 适当的(如果你不确定 是否需要,没有 以防万一使用它们有害)。做 不要将指针指向类型 ULONG、LONG、INT、UINT 或 DWORD。
请注意,HANDLE 被定义为 void*,所以类型转换一个 HANDLE 值 到一个 ULONG 值来测试、设置或 清除低 2 位是错误的 在 64 位 Windows 上。
【讨论】:
HWND 仅使用最低 32 位,因此跨进程边界是安全的。