给HWND分配任意地址
Assigning an arbitrary address to a HWND
我从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;
如果我找到原始答案,我会附上链接。
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- ReadProcessMemory() 不适用于像 0x2840C6C68D8 这样的长地址
- CPU如何知道任意变量的地址?
- 给HWND分配任意地址