为HWND分配任意地址

时间:2013-01-12 19:49:04

标签: c++ winapi pointers

据我所知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

我想这样做的原因是,如果有人反对我试图在第一时间做这件事,那就是我有一些涉及HWND的代码,我希望通过提供{ {1}}具有我可以测试的已知值。

3 个答案:

答案 0 :(得分:8)

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

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

或者只是演员。

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

答案 1 :(得分:1)

尝试

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

答案 2 :(得分:0)

我发现long long可转换为HWND

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

如果找到答案,我会提供原始答案的链接。