Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将任意地址分配给HWND_C++_Winapi_Pointers - Fatal编程技术网

C++ 将任意地址分配给HWND

C++ 将任意地址分配给HWND,c++,winapi,pointers,C++,Winapi,Pointers,正如我从中了解到的,aHWND相当于avoid*: HWND-窗口的句柄。该类型在WinDef.h中声明如下:typedef HANDLE HWND; 句柄-对象的句柄。该类型在WinNT.h中声明如下:typedef PVOID HANDLE; PVOID-指向任何类型的指针。该类型在WinNT.h中声明如下:typedef void*PVOID 但是,如果我尝试以下方法: int foo; HWND bar = &foo; 我的编译器(VS2012)抱怨: error C2440:

正如我从中了解到的,a
HWND
相当于a
void*

HWND-窗口的句柄。该类型在WinDef.h中声明如下:typedef HANDLE HWND; 句柄-对象的句柄。该类型在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;
是什么阻止我将任意对象的地址分配给
HWND


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

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

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

或者直接投

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

试试看

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

我发现
long-long
可用于
HWND

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

如果我找到了原始答案,我会将其链接包括在内。

谢谢。我正试图更多地了解STRICT,这是Windows特有的吗?我在MSDN上找到的对它的引用只讨论了
HANDLE
s等等。
STRICT
只是很久以前在WinSDK中引入的一个宏,用于在SDK头中配置更严格的类型检查。例如,不是让所有句柄都是相同的
void*
类型,而是成为指向不同类型的指针,这样编译器就能够检查您是否在应该使用另一种类型的句柄时错误地使用了一种类型的句柄。例如,如果没有
STRICT
,则
HWND
HBITMAP
的类型相同,因此如果在需要
HBITMAP
的地方传递
HWND
,编译器不会抱怨<代码>严格修复了这一问题。有关详细信息,请参阅。为什么您试图将某些内容分配给HWND变量,而该变量显然不是窗口的句柄?@selbie我在问题的最后一段已经回答了这个问题。