いくつかのコードを閲覧しているときに、OpenPrinter()の呼び出しを見つけました。コードはコンパイルされ、正常に動作します。ただし、 (MSDNで指定されているように)のHANDLE
代わりに渡します。次の宣言が存在するLPHANDLE
ことがわかりました。windef.h
typedef HANDLE FAR *LPHANDLE;
LPは何の略ですか?を使用する必要がありますかLPHANDLE
、それとも保持する必要がありHANDLE
ますか?
いくつかのコードを閲覧しているときに、OpenPrinter()の呼び出しを見つけました。コードはコンパイルされ、正常に動作します。ただし、 (MSDNで指定されているように)のHANDLE
代わりに渡します。次の宣言が存在するLPHANDLE
ことがわかりました。windef.h
typedef HANDLE FAR *LPHANDLE;
LPは何の略ですか?を使用する必要がありますかLPHANDLE
、それとも保持する必要がありHANDLE
ますか?
「LP」はLongPointerの略です。
HANDLE!= LPHANDLE、DWORD!= DWORD *(またはLPDWORD)と同じです
LPはLongPointerの略です。この場合、これはハンドルへのポインタです。
HANDLE h = <winapi function>();
LPHANDLE ph = &h;
ポインタを逆参照することにより、ハンドルと同じように使用できます。
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
FARコンストラクトは、 8086/8088 CPUとそれが使用したセグメント化されたメモリ モーダルの時代にさかのぼります。当時は、メモリへのNEARおよびFARポインターを使用できました。
LP (ロング ポインター) は、当時の Microsoft ハンガリー語表記法の名残りです。
最近の Win32 メモリ モデルはフラットであるため、NEARポインターとFARポインターは基本的に同じです。ただし、near ポインターはfarポインターと同じになりましたが、ポインターがハンドルと同じであることを意味するわけではありません。
また、少し背景を説明するために、ファーポインターとも呼ばれる長いポインターは、16ビットウィンドウの通常の16ビットポインターとは異なります。OSは、セグメントからオフセットするか、長いポインタであるセグメント+オフセットを持つセグメントメモリモデルを使用していました。ハンガリアン記法LPは、これらの長いポインターに使用されていましたが、これらのレガシーな理由から、WindowsAPI全体にまだ散らばっています。
もちろん、32ビットと64ビットのWindows OSでは、フラットメモリモデルが使用され、これらのOSのポインタを区別する必要はありません(ただし、PAEは概念的に類似したものを追加します)。