这是对this question的一种跟进。 Windows SDK具有HANDLE
中定义的WinNT.h
数据类型,如下所示:
typedef void *HANDLE;
此数据类型用于表示句柄。从技术上讲,句柄不是指针 - 它只是与Win32函数一起使用的神奇值。然而,它声明用一个void*
typedef。
如果我想使用以下代码输出句柄十六进制值:
HANDLE handle = ...;
printf("%p", handle);
会合法吗?
答案 0 :(得分:5)
是的没关系,原因有两个。首先它实际上是一个指针(指向void的指针),其次%p不会神奇地检查堆栈上的值是否为指针 - 它只是抓取下一个指针大小的值并将其打印出来。
答案 1 :(得分:0)
HANDLE handle = ...;
printf("%p", handle);
这是合法的吗?这是正确的,因为这将有效。同时,印刷手柄没有“合法方式”。 Microsoft可以自由地将句柄的定义更改为不同的内容,例如:
struct HANDLE { DWORD dummy; };
我甚至记得这个定义出现在一些较旧的书中。
32位NT有两种类型的句柄:32位和64位。因此,仍然需要检查您拥有的手柄。