给HWND分配任意地址

Assigning an arbitrary address to a HWND

本文关键字:地址 任意 分配 HWND      更新时间:2023-10-16

我从Windows数据类型的MSDN文档中了解到,HWND相当于void*:

HWND -窗口的句柄。该类型在WinDef.h中声明如下:句柄-对象的句柄。该类型在WinNT.h中声明如下:指向任何类型的指针。该类型在WinNT.h中声明如下:

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

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 void* MyType;
int foo;
MyType bar = &foo;

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

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

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

添加STRICT的原因之一是使编译器能够捕获您想要执行的隐式转换(而许多人实际上没有)。因为你实际上想要"松散检查",确保没有定义STRICT

或者直接转换。

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

Try

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

我发现long long可以浇注到HWND:

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

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