4

これは、この質問に対する一種のフォローアップです。HANDLE次のように定義されているWindows SDK 機能のデータ型WinNT.h:

typedef void *HANDLE;

このデータ型は、ハンドルを表すために使用されます。技術的には、ハンドルはポインターではありません。これは、Win32 関数でのみ使用できる魔法の値です。void*しかし、 typedefであるデータ型で表現されると宣言されています。

次のコードでハンドルの 16 進値を出力したい場合:

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

それは合法になりますか?

4

2 に答える 2

5

はい、問題ありません。理由は 2 つあります。まず、実際にはポインター (void へのポインター) であり、次に %p はスタック上の値がポインターであることを魔法のようにチェックしません。次のポインター サイズの値を取得して出力するだけです。

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

これは合法になりますか?これは機能するため、これは正しいでしょう。同時に、ハンドルを印刷する「合法的な方法」はありません。Microsoft は、handle の定義を次のように自由に変更できます。

struct HANDLE { DWORD dummy; };

この定義がいくつかの古い本にあったことさえ覚えています。

32 ビット NT には、32 ビットと 64 ビットの 2 種類のハンドルがあります。そのため、所有しているハンドルを確認する必要があります。

于 2012-07-30T19:09:54.860 に答える