【问题标题】:long to HWND (VS8 C++)长到 HWND (VS8 C++)
【发布时间】: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


    【解决方案1】:

    只要你确定你拥有的 LONG 确实是一个 HWND,那么它就这么简单:

    HWND hWnd = (HWND)(LONG_PTR)lParam;
    

    【讨论】:

    • 感谢您的回复。我试过了,得到一个警告:warning C4312: 'type cast' : conversion from 'LONG' to 'HWND' of greater size 有什么建议吗?谢谢。
    • 我认为这是最好的答案,(HWND) long_ver 不适合我!
    【解决方案2】:

    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 位应用程序,您可以忽略它们。

    【讨论】:

      【解决方案3】:

      仅当您不是在 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 上。

      【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多