関数プロトタイプの規則

Windows SDK には、汎用、 Windows コード ページUnicode バージョンの関数プロトタイプが用意されています。 プロトタイプをコンパイルして、Windows コード ページ プロトタイプまたは Unicode プロトタイプを生成できます。 3 つのプロトタイプはすべてこのトピックで説明し、 SetWindowText 関数のコード サンプルで示します。

汎用プロトタイプの例を次に示します。

BOOL SetWindowText(
  HWND hwnd,
  LPCTSTR lpText
);

ヘッダー ファイルはマクロとして実装される汎用関数名を提供します。

#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE

プリプロセッサは、マクロを Windows コード ページまたは Unicode 関数名に展開します。 必要に応じて、汎用関数名の末尾に文字 "A" (ANSI) または "W" (Unicode) が追加されます。 次に、ヘッダー ファイルには、次の例に示すように、2 つの特定のプロトタイプ (1 つは Windows コード ページ用、もう 1 つは Unicode 用) が用意されています。

BOOL SetWindowTextA(
  HWND hwnd,
  LPCSTR lpText
);
BOOL SetWindowTextW(
  HWND hwnd,
  LPCWSTR lpText
);

「文字列の Windows データ型」で説明されているように、ジェネリック関数プロトタイプでは text パラメーターにデータ型 LPCTSTR が使用されます。 ただし、Windows コード ページ プロトタイプではデータ型は LPCSTR が、Unicode のプロトタイプでは LPCWSTR が使用されます。

テキスト引数を持つすべての関数では、通常、アプリケーションは汎用関数プロトタイプを使用する必要があります。 ヘッダー ファイルの #include ステートメントの前またはコンパイル時に、アプリケーションで "UNICODE" が定義されている場合、ステートメントは Unicode 関数にコンパイルされます。

注意

新しい Windows アプリケーションでは、さまざまなコード ページの不整合を回避し、ローカライズを容易にするために Unicode を使用する必要があります。 ジェネリック関数を使用して記述し、UNICODE 関数を Unicode 関数にコンパイルするために UNICODE を定義する必要があります。 アプリケーションが 8 ビット文字データを操作する必要があるいくつかの場所では、Windows コード ページに関数を明示的に使用できます。

 

アプリケーションでは、汎用文字列型および汎用文字型の汎用関数プロトタイプを常に使用してください。 大文字 "W" で終わるすべての関数名は Unicode、つまりワイド文字のパラメーターを受け取ります。 一部の関数は Unicode バージョンにのみ存在し、適切なデータ型でのみ使用できます。 たとえば、 LCIDToLocaleNameLocaleNameToLCID には Unicode バージョンしかありません。

各 Unicode および文字セット関数のリファレンス ドキュメントの「要件」セクションには、サポートされているオペレーティング システムによって実装される関数のバージョンに関する情報が記載されています。 "Unicode" で始まる行が含まれている場合、関数には個別の Unicode と Windows コード ページのバージョンがあります。

注意

関数に文字列の長さパラメーターがある場合、長さは文字列内の TCHAR 値のカウントとして文書化する必要があります。 このデータ型は、関数の Windows コード ページ バージョンの場合はバイト、Unicode バージョンの場合は 16 ビットワードを参照します。 ただし、 GlobalAlloc 関数などの型指定されていないメモリ ブロックへのポインターを必要とするか返す関数は、通常、使用されるプロトタイプに関係なく、バイト単位のサイズを受け取ります。 型指定されていないメモリの割り当てが文字列に対する場合、アプリケーションは文字数に sizeof(TCHAR) を掛ける必要があります。 詳細については、「 ジェネリック データ型の使用」を参照してください。

 

Windows API の Unicode