这是WinNT.h
的第519行(BUILD版本:0091)
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
为什么我们需要一个指向结构的指针,该结构具有一个名为unused
的奇怪名称的int成员?
我们是否需要使用像这样的一行代码?
HINSTANCE hInstance = new HINSTANCE__;
总体上声明具有相同结构的不同数据类型对我来说没有意义。这背后的想法是什么?
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSPRITE);
DECLARE_HANDLE(HLSURF);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);
答案 0 :(得分:11)
关键是不同的句柄具有不同的类型,例如,HINSTANCE不能分配给HANDLE。如果它们都被定义为“void *”,那么编译器无法检测到错误类别。
答案 1 :(得分:1)
我们是否需要使用像这样的一行代码?
HINSTANCE hInstance = new HINSTANCE __;
您通常使用Windows系统调用返回的HINSTANCE
值;我从来没有看到代码执行这样的行。
答案 2 :(得分:1)
他们实际上并没有指出任何记忆;它们仅用于在调用Windows API时引用对象(文件,资源,信号量,窗口)。虽然它们只不过是内核对象表的索引,但开发人员决定将它们作为指向未使用结构的指针,这将使它们“不透明”并减少其他类型之间的混淆。 DECLARE_HANDLE
是一个函数宏,它就是这样做 - 为句柄声明不透明的类型。