Win32 系统 API 在 LPCWSTR(指向 Wchar_t 的 C 风格 NULL 终止数组的指针)上运行。
系统头文件提供每个 API 的两个版本,例如 SetWindowTextA(HWND, LPCSTR) 和 SetWindowTextW(HWND, LPCWSTR) 以及根据项目中 UNICODE 的定义将 SetWindowText() 映射到相关的宏,即:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
SetWindowTextA() API 将从其 LPCSTR 参数构建一个临时 LPCWSTR,并在操作代码所在的位置调用 SetWindowTextW(),因此在代码中不使用 UNICODE 和 wchar_t 会降低性能。
COM 接口设计用于在 BSTR 上运行,这些 BSTR 是系统分配的,可在不同进程之间共享。
很高兴可以使用 MS 编译器提供的 _bstr_t 类从 LPCWSTR 构建 BSTR:_bstr_t myBstr(/LPCWSTR/psText)。
ATL::CString 和 MFC CString 类(它们共享大部分代码)使用相同的宏机制并映射到 CStringA 或 CStringW。两者都有一个内置运算符 (CStringA::operator LPCSTR() CStringW::operator LPCWSTR()),因此您可以将 CString 传递给 Win32 API:
CString myStr = _T("Hello");
::SetWindowText(myHwnd, myStr);
std::[w]string 没有这样的内置运算符,但有一个 c_str() 成员,它做同样的事情:
std::wstring myStr = L"Hello"; // assuming UNICODE defined
::SetWindowText(myHwnd, myStr.c_str());
总结:
-
在所有项目中定义 UNICODE 以避免 Win32 平台上的性能损失。
- 如果您使用 MFC,您自然会使用它的 CString 类,如果您使用 ATL 或不使用,您可以使用 ATL::CString,它是一个独立的类
(#include <atlstr.h> 不包括 ATL 库)或 std::wstring。
- 如果必须可移植到其他系统,则必须使用 std::wstring。