🛠️MSのポインタがらみの型LPSTR型とか 型図鑑

LPSTR型とその別名であるPSTR型は、8ビット文字の配列へのポインタを指定し、ヌル文字で終端してもよい(MAY)。
プロトコルによっては、ヌル文字で終了しないことが許容される場合があり、このオプションは仕様で示されることになります。この場合、LPSTR または PSTR 型は、文字列のセマンティクスを示す IDL 修飾子 [string] でタグ付けされるか、または [size_is()] などの長さの明示的な指定子を伴わなければならない (MUST)。
文字のフォーマットは、それを使用するプロトコルによって指定されなければならない(MUST)。一般的な8ビット形式はANSIとUTF-8の2つである。
8ビット文字の文字列への32ビットポインタであり、ヌル文字で終端してもよい(MAY)。

https://learn.microsoft.com/ja-jp/openspecs/windows_protocols/ms-dtyp/3f6cc0e2-1303-4088-a26b-fb9582f29197
 typedef char* PSTR, *LPSTR;
https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/VolumeShadowCopyServiceProvider/cpp/utility.cpp

LPSTRは「long pointer to string」の略で、文字列への長いポインタのことです。32ビットプロセッサが登場する以前は、メモリ内の別のセグメント(メモリ内の遠い場所と考える)にある可能性のあるメモリへのポインタを格納するために余分なスペースが必要でした。

https://stackoverflow.com/questions/11945990/difference-between-char-and-lpstr-in-windows#:~:text=LPSTR%20stands%20for%20%22long%20pointer,needed%20extra%20space%20to%20store.

マイクロソフトが提供しているWindowsプログラミングで使用される主な文字列型をまとめてみましょう。これらの型は、特にWindows APIでの使用を目的としており、CやC++などのプログラミング言語でよく見られます。

  1. LPSTR

    • `char*` 型のポインタ。ANSI文字列を指します。

  2. LPCSTR

    • `const char*` 型のポインタ。変更不可のANSI文字列を指します。

  3. LPWSTR

    • `wchar_t*` 型のポインタ。Unicode文字列を指します。

  4. LPCWSTR

    • `const wchar_t*` 型のポインタ。変更不可のUnicode文字列を指します。

  5. LPTSTR

    • ビルド設定に依存する文字ポインタ。`_UNICODE` マクロが定義されている場合は `wchar_t*`、定義されていない場合は `char*` になります。

  6. LPCTSTR

    • ビルド設定に依存する定数文字ポインタ。`_UNICODE` マクロが定義されている場合は `const wchar_t*`、定義されていない場合は `const char*` になります。

  7. BSTR

    • COM(Component Object Model)プログラミングで使用される、長さプレフィックス付きのUnicode文字列型。

これらの型は、Windowsプラットフォーム上でのプログラミングにおいて、様々な状況で文字列を扱う際の標準的な方法を提供します。特に`LPTSTR`や`LPCTSTR`のような型は、プロジェクトの設定によってANSIとUnicodeの間で切り替わるため、柔軟なコーディングが可能になります。

Windows APIでは、文字列型以外にも様々なデータ型がマクロを使ってエイリアスとして定義されており、プラットフォームやコンパイラの違いに柔軟に対応するための抽象化が行われています。以下は、そのような代表的な型のエイリアスの一部です:

  1. HANDLE

    • オブジェクトやリソースへの参照を抽象化したハンドル。通常は`void*`のエイリアスです。

  2. DWORD

    • 符号なし32ビット整数。`unsigned long` のエイリアスです。

  3. BOOL

    • 真偽値。通常は`int`のエイリアスで、`TRUE` や `FALSE` と定義されます。

  4. BYTE

    • 符号なし8ビット整数。`unsigned char`のエイリアスです。

  5. WORD

    • 符号なし16ビット整数。`unsigned short`のエイリアスです。

  6. LONG

    • 符号付き32ビット整数。`long`のエイリアスです。

  7. WPARAM

    • メッセージに関連する追加情報を渡すためのパラメータ。プラットフォームによってサイズが異なる場合があり、通常は`UINT_PTR`のエイリアスです。

  8. LPARAM

    • メッセージに関連する追加情報を渡すためのパラメータ。プラットフォームによってサイズが異なる場合があり、通常は`LONG_PTR`のエイリアスです。

これらの型は、APIの呼び出しをより安全かつ便利にするため、また異なるプラットフォーム間での互換性を保つために使用されます。

Ptrもエイリアスですか?

はい、Windows APIにおける`Ptr`という接尾辞を持つ型名も、ポインタサイズがプラットフォームに依存することを抽象化するためのエイリアスです。これらの型は主に32ビットと64ビットの両方のアーキテクチャで互換性を持たせるために使われます。以下はその例です:

  1. INT_PTR

    • 符号付きポインタサイズ整数。これは、32ビットシステムでは`int`、64ビットシステムでは`__int64`に対応します。

  2. UINT_PTR

    • 符号なしポインタサイズ整数。これは、32ビットシステムでは`unsigned int`、64ビットシステムでは`unsigned __int64`に対応します。

  3. LONG_PTR

    • 符号付きポインタサイズ整数。これは、32ビットシステムでは`long`、64ビットシステムでは`__int64`に対応します。

  4. ULONG_PTR

    • 符号なしポインタサイズ整数。これは、32ビットシステムでは`unsigned long`、64ビットシステムでは`unsigned __int64`に対応します。

これらの型は、特にウィンドウプロシージャのパラメータや様々なAPI関数で、メモリアドレスやその他の整数値を格納するために使用され、アーキテクチャ間でのデータサイズの違いを透過的に扱うことができます。

お願い致します