文字列を受け取るほとんどのWindowsAPIには、2つのバージョンがあります。1つは取るchar *
、もう1つは取るWCHAR *
(後者はと同等ですwchar_t *
)。
SetWindowText
たとえば、は実際にはSetWindowTextA
(をとるchar *
)またはSetWindowTextW
(をとる)のいずれかに展開されるマクロですWCHAR *
。
プロジェクトでは、これらのマクロはすべて-Wバージョンを参照しているようです。これは、UNICODE
プリプロセッサマクロ(Visual Studioで[Unicode文字セットを使用]プロジェクトオプションを選択した場合に定義されます)によって制御されます。(MicrosoftのCおよびC ++ランタイムライブラリ関数の一部には、ANSIバージョンとワイドバージョンもあります。どちらを取得するかは_UNICODE
、そのVisualStudioプロジェクト設定でも定義されている同様の名前のマクロによって選択されます。)
通常、アプリケーションがUnicode用にコンパイルされている場合でも、-A関数と-W関数の両方がライブラリに存在し、使用できます。(例外があります。一部の新しい機能は、「ワイド」バージョンでのみ使用できます。)
char *
適切なANSIコードページにテキストを含むが含まれている場合は、-Aバージョンを明示的に呼び出すことができます(例:) SetWindowTextA
。-Aバージョンは通常、文字列パラメーターのワイド文字コピーを作成し、-Wバージョンに制御を渡すラッパーです。
別の方法は、文字列の独自のワイド文字コピーを作成することです。これは、 MultiByteToWideCharを使用して実行できます。バッファを管理する必要があるため、呼び出すのは難しい場合があります。-Aバージョンを直接呼び出すことを回避できる場合、それは一般的に単純であり、すでにテストされています。ただし、char *
文字列がUTF-8またはユーザーの現在のANSIコードページ以外のエンコーディングを使用している場合は、自分で変換を行う必要があります。
ボーナス情報
-A接尾辞は、「ANSI」を表します。これは、シングルバイトコードページの文字セットの一般的なWindows用語でした。
-Wサフィックスは「ワイド」を表します(エンコーディング単位が1バイトより広いことを意味します)。具体的には、Windowsはワイド文字列にリトルエンディアンUTF-16を使用します。MSDNのドキュメントでは、これを単に「Unicode」と呼んでいますが、これは少し誤称です。