序文:
新しいコードはGeneric-Text Mappingsを使用すべきではありません。それらは、ANSIシステム(Win9x)からUnicodeシステム(Windows NT)へのコード移植を容易にするために90年代に考案されました。 TCHAR
は、UNICODE
と_UNICODE
のプリプロセッサシンボルによって制御されるchar
またはwchar_t
のいずれかに展開されます。
Win9xをサポートする必要がない限り、TCHAR
は使用しないでください。
分析:
あなたはそれがあるよりも、この方法はより複雑になっています。このコード
TCHAR* wArr = ...;
cout << wArr << endl;
ので、あなたはプリプロセッサシンボルUNICODE
または_UNICODE
定義していない(ポインタ値対)cout
に文字列を書き込みます。言い換えれば:あなたは、同じ出力を生成する(Unicode and MBCSを参照)MBCS文字エンコーディングを使用して、次のとおりです。
string szDllPath = "12345";
cout << szDllPath.c_str() << endl;
それはあなたが望む本当に(と私はそれがある疑う)場合は、単純にstd::basic_string::cstr()をされて呼び出すと、十分です(可変文字列が必要な場合はstd::basic_string::data()を使用してください)。
推奨ソリューション:
Unicodeを使用を通して。文字列リテラルを使用している場合、次のようにすればすぐに問題は解決します。
wstring szDllPath = L"12345";
wcout << szDllPath.c_str() << endl;
リテラル文字列を使用していないとワイド文字列にstd::string
から変換する必要がない場合は、変換を実行するためにMFCのCStringクラスを使用することができます:あなたが必要
CStringW wideString(szDllPath.c_str()); // Conversion c'tor, taking a const char*
const wchar_t* = (LPCWSTR)wideString; // Invoke operator LPCWSTR()
を終了するヌル文字 'wArr [size] = '\ 0';'を追加する。明らかに 'TCHAR * wArr = new TCHAR [size + 1];を宣言する必要があります。 – chema989
** **はありません。マイクロソフトの「TCHAR」偽名を使用しないでください。これは、Windows 9x用の限定された機能バージョンのプログラムを提供するためのサポートであり、2000年にはすでにUnicode用レイヤーが導入されています。 MicrosoftはWindows 2000以前のツールのサポートを中止して以来、すべてのものが順番に廃止されました。だから、これは廃止されたテクノロジーであり、現在では廃止されたテクノロジに置き換えられ、遭遇する時間に戻って旅しなければならない問題に取り組んでいます。 –