8

在 Visual Studio 2010(C++,非托管)中调试,信息是什么unused ???unused 0应该是什么意思?我附上了两个屏幕截图,孩子是HWND现有窗口的一个。

我也很困惑,HWND有时显示为“未使用”,有时显示为“0”。当有一个指向未分配内存的指针时,我会理解这种情况,但在我的特殊情况下,窗口已经创建并且有效。

VS2010未使用=???

VS2010 未使用=0

4

1 回答 1

7

这可以追溯到九十年代初,当时只有一个 HANDLE 作为类型来声明任何 Windows 对象的句柄。这是一个错误工厂,程序员可以摸索代码,例如,在需要窗口句柄的地方传递一个字体句柄。所以后来添加了 STRICT 宏,它重新声明了句柄类型,因此混合会产生编译器错误。在 winnt.h 中看起来像这样,针对内容进行了编辑:

#ifdef STRICT
   typedef void *HANDLE;
   #define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#else
   typedef PVOID HANDLE;
   #define DECLARE_HANDLE(name) typedef HANDLE name
#endif

示例用法:

DECLARE_HANDLE(HWND);

struct 宏汤确保当 STRICT 打开时,HFONT 永远不能用于预期 HWND 的地方,它会在结构类型上产生类型不匹配。

您现在可以看到“未使用”的来源。它实际上是未使用的,只有 Windows 可以创建句柄值。它在调试器中很有帮助,因为它可以让您查看句柄值,0 或 -1 肯定是有问题的迹象。

此 MSDN 文章中有关 STRICT 的更多信息。

于 2012-06-26T09:56:29.087 回答