我可以使用%p说明符输出Windows句柄吗?

时间:2012-07-30 10:17:59

标签: c++ winapi pointers handle format-specifiers

这是对this question的一种跟进。 Windows SDK具有HANDLE中定义的WinNT.h数据类型,如下所示:

typedef void *HANDLE;

此数据类型用于表示句柄。从技术上讲,句柄不是指针 - 它只是与Win32函数一起使用的神奇值。然而,它声明用一个void* typedef。

的数据类型表示

如果我想使用以下代码输出句柄十六进制值:

HANDLE handle = ...;
printf("%p", handle);

会合法吗?

2 个答案:

答案 0 :(得分:5)

是的没关系,原因有两个。首先它实际上是一个指针(指向void的指针),其次%p不会神奇地检查堆栈上的值是否为指针 - 它只是抓取下一个指针大小的值并将其打印出来。

答案 1 :(得分:0)

HANDLE handle = ...;
printf("%p", handle);

这是合法的吗?这是正确的,因为这将有效。同时,印刷手柄没有“合法方式”。 Microsoft可以自由地将句柄的定义更改为不同的内容,例如:

struct HANDLE { DWORD dummy; };

我甚至记得这个定义出现在一些较旧的书中。

32位NT有两种类型的句柄:32位和64位。因此,仍然需要检查您拥有的手柄。