_TCHAR のマッピング

提供: Appmethod Topics
移動先: 案内検索

C++ 用 Unicode:インデックス への移動

Appmethod C++ の _TCHAR マッピングは、ワイド文字列またはナロー文字列のいずれかと一緒に使われるソース コードの記述を簡単にすることを目的としています。 FireMonkey、VCL、または Windows API で必要な適切な文字列型がコードで使用され、RTL 関数が適切な定義(それぞれ、ワイド型またはナロー型)に設定されるように、_TCHAR を wchar_t または char のいずれかにマップできます。 [_TCHAR のマップ先]オプションを設定するには、プロジェクト > オプション... > [C++ (共有オプション)] ダイアログ ボックスを使用します。

C++ アプリケーションでは、ワイド文字列とナロー文字列の両方を扱う必要があります。

  • C++ RTL には、charwchar_t の両方のために設計されたルーチンがあります。
  • Windows API は通常はナロー型なので、char が必要になります。
  • FireMonkey と VCL (2009 以降)は、wchar_t を必要とするワイド文字列データ(Unicode)を使用します。

FireMonkey と VCL とのやり取りでは、ワイド RTL 関数を使用するか、FireMonkey または VCL にデータを渡す前に適切な変換を行う必要があります。 (「UTF-8 変換ルーチン」を参照)。

_TCHAR は、tchar.h ヘッダー ファイルで条件付きで宣言されており、char または wchar_t のいずれかにマッピングされる typedef(エイリアス)として定義されています。 移植性のある(C++ RTL、Windows API、FireMonkey、および VCL とやり取りできる)コードを記述したい場合、_TCHAR を使用しなければなりません(データ型 charwchar_t をハード コーディングする代わりに)。そして、_TCHAR のマッピング オプションを、charwchar_t に設定します([C++ (共有オプション)] ページにて)。たとえば、現在の _TCHAR マッピング設定は、アプリケーションが RTL マップ関数 の ANSI バージョン、ワイド バージョンのどちらを使用するのかを制御します。

[_TCHAR のマップ先]オプション

プロジェクト オプション[_TCHAR のマップ先]では、コードにおける _TCHAR のマップ定義を制御します。
_TCHAR は、次の表に示すように、char または wchar_t にマッピングすることができます。

[_TCHAR のマップ先]オプションの値: '

char
_TCHARchar に置き換えます。

メモ: このオプションは、標準ライブラリおよび API 関数のワイド定義には適用されません。

wchar_t
  • _TCHARwchar_t に置き換えます。
  • UNICODE および _UNICODE のマクロ定数を設定します。
  • 標準ライブラリおよび API 関数のワイド定義に適用されます。


[ディレクトリと条件定義]ページの[_TCHAR のマップ先]オプションの設定

プロジェクト > オプション... > [C++ (共有オプション)] ダイアログ ボックスを使用します。

FireMonkey と VCL では [_TCHAR のマップ先]で wchar_t を使用

FireMonkey と VCL は Unicode で実装されており、常に Unicode を想定しています。デフォルトで _TCHAR は wchar_t にマッピングされます。

たとえば次のコードは、[_TCHAR のマップ先]オプションを[wchar_t]に設定しないとコンパイルが成功しません。

TResourceStream* res =  new
    TResourceStream(HInstance, ResourceId, RT_RCDATA);

[_TCHAR のマップ先]オプションが char に設定されている場合、RT_RCDATAchar* にマッピングされます。FireMonkey と VCL は wchar_t* を想定しているため、FireMonkey や VCL で作業する場合、この char 設定は問題となります。

[_TCHAR のマップ先]を wchar_t で使用するために必要なコード変更

_TCHAR を wchar_t にマッピングする場合(デフォルト設定)、プロジェクトに _tmain または _tWinMain でのエントリ ポイントが必要となります。Appmethod C++ を使用して作成した新規プロジェクトは、デフォルトでこのエントリ ポイントを持っています。ただし、インポートしたプロジェクトの場合は、このエントリ ポイントを手動で追加する必要があるかもしれません。

tchar.h ヘッダー ファイルをインクルードする必要もあります。これには必要なエントリ ポイントとマップ定義が含まれます。 tchar.h に含まれるマップ関数のリストについては、「マップ関数」を参照してください。

メモ: _tmain ではなく main をエントリ ポイントに使用すると、リンカは実行可能ファイルをリンクできません。 FireMonkey または VCL を使用する新規プロジェクトでは、ウィサードによって自動的に _tmain エントリ ポイントが挿入されます。

テキスト リテラル前での _TEXT マクロの使用

文字リテラルと文字列リテラルを ANSI または Unicode に正しくマッピングできるようにするには、_TEXT マクロか _T マクロのどちらかを使用します。 以下に例を示します。

::MessageBox(0, _TEXT("The message"), _TEXT("The caption"), MB_OK);

_UNICODE が定義されていると、_TEXT(または _T)マクロはリテラル文字列(文字)を先頭に L を付けた形式に変換します。それ以外の場合、_TEXTL 接頭辞を付けずにリテラルを変換します。 たとえば、_UNICODE を定義して次のように記述すると、

_TEXT("The message")

次のように先頭に L を付けた形式に変換されます。

L"The message"

それ以外の場合、このマクロは L 接頭辞を付けず、次のように変換します。

"The message"

関連項目