Системные API-интерфейсы Win32 работают на LPCWSTR (указатели на терминированные NULL-символы в стиле C для wchar_t).
Системные заголовки предоставляют две версии каждого API, например, SetWindowTextA (HWND, LPCSTR) и SetWindowTextW (HWND, LPCWSTR), а также сопоставление макроса SetWindowText () для соответствующей в зависимости от определения UNICODE в вашем проекте, т.е.:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
API SetWindowTextA () создаст временный LPCWSTR из своего параметра LPCSTR и вызовет SetWindowTextW (), где находится рабочий код, поэтому отсутствие использования UNICODE и wchar_t в вашем коде приводит к снижению производительности.
Интерфейсы COM предназначены для работы на BSTR, которые выделены для распределения между различными процессами.
К счастью, BSTR можно построить из LPCWSTR с помощью предоставленного компилятором MS _bstr_t class: _bstr_t myBstr (/ LPCWSTR / psText).
Классы ATt :: CString и MFC CString (которые совместно используют большую часть своего кода) используют один и тот же механизм макросов и отображаются в CStringA или CStringW. Оба имеют встроенный оператор (CStringA :: operator LPCSTR () CStringW :: operator LPCWSTR ()), поэтому вы можете передать CString в Win32 API:
CString myStr = _T("Hello");
::SetWindowText(myHwnd, myStr);
std :: [w] строка не имеет такого встроенного оператора, но член 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.