【问题标题】:Assigning an arbitrary address to a HWND将任意地址分配给 HWND
【发布时间】:2013-01-12 19:49:03
【问题描述】:

据我了解MSDN documentation on Windows Data TypesHWND 等同于void*

HWND - 窗口句柄。这种类型在 WinDef.h 中声明如下: typedef HANDLE HWND; HANDLE - 对象的句柄。这种类型在 WinNT.h 中声明如下: typedef PVOID HANDLE; PVOID - 指向任何类型的指针。此类型在 WinNT.h 中声明如下: typedef void *PVOID;

但是,如果我尝试以下操作:

int foo;
HWND bar = &foo;

我的编译器(VS2012)抱怨:

error C2440: '=' : cannot convert from 'int *' to 'HWND'
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast

我不知道为什么。我已经确定它与 typedef 的使用无关,因为以下编译正常:

typedef void* MyType;
int foo;
MyType bar = &foo;

是什么阻止我将任意对象的地址分配给HWND

如果有人反对我首先尝试这样做,我想这样做的原因是我有一些涉及 HWNDs 的代码,我想通过提供 HWND 来进行单元测试s 具有我可以测试的已知值。

【问题讨论】:

  • 你为什么要给一个显然不是窗口句柄的 HWND 变量赋值?
  • @selbie 我已经在问题的最后一段回答了这个问题。

标签: c++ winapi pointers


【解决方案1】:

如果在编译期间定义了STRICT,则HWND 被定义为指向虚拟结构的指针,而不是void*

添加STRICT 的原因之一是使编译器能够捕获您想要执行的那种隐式转换(很多人确实没有)。由于您实际上想要“松散检查”,因此请确保未定义 STRICT

或者只是投射。

(请注意,您链接的 MSDN 文档页面上 yic81 的 cmets 表明它需要一些更新)

【讨论】:

  • 谢谢。我试图更多地了解 STRICT - 这是专门针对 Windows 的吗?我在 MSDN 上找到的对它的引用只谈论 HANDLEs 之类的。
  • STRICT 只是很久以前在 WinSDK 中引入的一个宏,用于在 SDK 头文件中配置一些更严格的类型检查。例如,不是让所有句柄都是相同的void* 类型,而是成为指向不同类型的指针,因此编译器将能够检查您是否错误地使用了一种类型的句柄,而应该使用另一种类型。例如,如果没有STRICTHWNDHBITMAP 的类型相同,因此如果您传递HWND,其中需要HBITMAP,编译器不会抱怨。 STRICT 解决了这个问题。有关详细信息,请参阅support.microsoft.com/kb/83456
【解决方案2】:

试试

int foo;
HWND bar = (HWND)&foo;

【讨论】:

    【解决方案3】:

    我发现long long 可以转换为HWND

    long long llHwnd = 133282;
    HWND hwnd = (HWND)llHwnd;
    

    如果我找到原始答案的链接,我会附上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多