関数プロトタイプの規則

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) が追加されます。 次に、ヘッダー ファイルには、次の例に示すように、Windows コード ページ用と Unicode 用の 2 つの特定のプロトタイプが用意されています。

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

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

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

Note

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

 

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

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

Note

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

 

Windows API の Unicode