0

私は Ansi char 配列を持っていて、CStringW (CString テンプレートの WCHAR 特殊化) を初期化したいと考えています。しかし、CString オブジェクトには、配列から文字をコピーする機能がありません。

CStringW sSample = "ABC";
int length = sSample.GetLength(); // returns 3
PCWSTR wcsSample = (PCWSTR)sSample;
wcout << (int)wcsSample[0];  // output: 0
  • バージョン: ATL/MFC バージョン 8.0
  • プラットフォーム: Windows CE 5.0 (x86)

回避策はありますか?

4

1 に答える 1

0

まあ、私は自分で答えを見つけました。MFCメソッドのバグです

CStringT& operator=( __in_z_opt PCYSTR pszSrc )

このメソッドは、必要なバッファーの長さを計算し、バッファーを割り当てます。計算には、終端のヌル文字は含まれません。その後、MultiByteToWideChar を呼び出し、長さを cchWideChar パラメータとして渡します。

関数 MultiByteToWideChar は失敗を示すとして 0 を返しますが、これは MFC によって無視されます。副作用として、MultiByteToWideChar は、Win32 や Windows CE 5.0 (SH4) などの一部のプラットフォームで出力バッファーをいっぱいにします。

ただし、Windows CE 5.0 (x86) ではバッファがいっぱいになりません。割り当てられたバッファは小さすぎますが、このバグはほとんどのプラットフォームでは見られませんが、Windows CE 5.0 (x86) では見られます。ここでは、割り当て後に空の CString を取得します。

MFC の欠陥は、すべての MFC バリアントに存在します。MultiByteToWideCharただし、プラットフォームによって動作が異なるの動作によってカバーされます。

于 2012-07-20T12:40:34.990 に答える