4

这是对这个问题的一种跟进。Windows SDK 具有如下HANDLE定义的数据类型:WinNT.h

typedef void *HANDLE;

此数据类型用于表示句柄。从技术上讲,句柄不是指针——它是只能用于 Win32 函数的神奇值。然而,它被声明为使用void*typedef 的数据类型来表示。

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

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

会合法吗?

4

2 回答 2

5

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

于 2012-07-30T10:25:40.773 回答
1
HANDLE handle = ...;
printf("%p", handle);

这会合法吗?这将是正确的,因为这将起作用。同时也没有打印手柄的“合法途径”。Microsoft 可以自由地将句柄的定义更改为不同的定义,例如:

struct HANDLE { DWORD dummy; };

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

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

于 2012-07-30T19:09:54.860 回答