用C ++编写的VS2010调试器,意思是“unused = ???”或“unused = 0”

时间:2012-06-26 09:16:34

标签: c++ visual-studio-2010 debugging remote-debugging

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

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

VS2010 unused=???

VS2010 unused=0

1 个答案:

答案 0 :(得分:6)

这可以追溯到九十年代早期,当时只有一个HANDLE作为声明任何Windows对象句柄的类型。这是一个bug工厂,程序员可以摸索代码,比如说,传递一个需要窗口句柄的字体句柄。因此稍后添加了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 macro soup确保在STRICT打开时,在预期HWND的地方永远不能使用HFONT,它会在结构类型上产生类型不匹配。

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

更多关于this MSDN article中的STRICT。