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 回答