5

正如我从有关 Windows Data Types的 MSDN 文档中了解到的那样, aHWND相当于 a 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

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

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

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

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

4

3 回答 3

8

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

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

或者只是投。

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

于 2013-01-12T19:52:57.797 回答
2

尝试

int foo;
HWND bar = (HWND)&foo;
于 2013-01-12T19:56:28.937 回答
0

我发现它long long可以转换为HWND

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

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

于 2020-09-20T12:32:21.820 回答