为HWND分配任意地址

JBe*_*ley 1 c++ winapi pointers

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

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

但是,如果我尝试以下方法:

int foo;
HWND bar = &foo;
Run Code Online (Sandbox Code Playgroud)

我的编译器(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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚原因.我已经确定它与typedef的使用无关,因为以下编译很好:

typedef void* MyType;
int foo;
MyType bar = &foo;
Run Code Online (Sandbox Code Playgroud)

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

我想这样做的原因是,如果有人反对我试图在第一时间做这件事,那就是我有一些涉及HWNDs的代码,我希望通过为HWNDs提供我可以测试的已知值进行单元测试.

Mic*_*urr 8

如果STRICT在编译期间定义,则将HWNDa定义为指向虚拟结构而不是a的指针void*.

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

或者只是演员.

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

  • `STRICT`只是很久以前在WinSDK中引入的一个宏,用于在SDK头中配置一些更严格的类型检查.例如,它们不是让所有句柄都是相同的`void*`类型,而是成为指向不同类型的指针,因此编译器将能够检查你是否错误地使用了一种类型的句柄而应该使用另一种类型.例如,如果没有`STRICT`,`HWND`与`HBITMAP`的类型相同,所以如果你传递`HWND`,其中需要`HBITMAP`,编译器就不会抱怨.`STRICT`解决了这个问题.有关详细信息,请参见http://support.microsoft.com/kb/83456. (2认同)