Система API, Win32 работают на LPCWSTR (указатели на С-типа NULL прекращается массивы wchar_t). Системные заголовки предоставляют две версии каждого API, например SetWindowTextA (HWND, LPCSTR) и SetWindowTextW (HWND, LPCWSTR), и макрографическое отображение SetWindowText() для соответствующего в зависимости от определения UNICODE в вашем проекте, то есть:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
SetWindowTextA (API) будет строить временный LPCWSTR от его параметров LPCSTR и вызвать SetWindowTextW(), где рабочий код, поэтому не используется Юникод и wchar_t в коде получает штраф производительности.
Интерфейсы COM предназначены для работы с BSTR, которые являются системой, распределенной между различными процессами.
К счастью, BSTR может быть построен из LPCWSTR с МС-го класса компилятор при условии _bstr_t: _bstr_t myBstr (/ LPCWSTR/psText).
Классы ATL :: CString и MFC CString (которые используют большую часть своего кода) используют один и тот же механизм макросов и сопоставляются с CStringA или CStringW.Оба имеют встроенный оператор (CStringA :: Оператор LPCSTR() CStringW :: Оператор LPCWSTR()), так что вы можете передать CString к API Win32:
CString myStr = _T("Hello");
::SetWindowText(myHwnd, myStr);
станд :: [ш] строка не имеет никакой такой встроенный -в оператор, но член c_str(), который делает то же самое:
std::wstring myStr = L"Hello"; // assuming UNICODE defined
::SetWindowText(myHwnd, myStr.c_str());
Резюме:
определить UNICODE во всех проектах, чтобы избежать ухудшая производительность на платформе Win32.
- Если вы используете MFC, вы, естественно, будете использовать его класс CString, если вы используете ATL или none, вы можете использовать ATL :: CString, который является автономным классом
(#include <atlstr.h>
, не включает в себя библиотеку ATL) или std :: wstring.
- Если переносимость в другие системы необходима, вам необходимо использовать std :: wstring.
Как разяснение, 'CString' теперь является« общим »классом между MFC и ATL (т. Е. Вы можете использовать' CString', не втягивая рамки MFC): http://msdn.microsoft.com/ en-us/library/zzs00fs6.aspx –
Кроме того, при использовании Windows API вы, вероятно, захотите использовать 16-разрядные символы ширины, то есть std :: wstring вместо std :: string. –