我有一个_bstr_t
变量bstrErr
和一个CString
变量csError
。我应该如何将bstrErr
中的值设置为csError
中的值?
我有一个_bstr_t
变量bstrErr
和一个CString
变量csError
。我应该如何将bstrErr
中的值设置为csError
中的值?
直接强制类型转换不行吗:
_bstr_t b("Steve");
CString cs;
cs = (LPCTSTR) b;
我认为当项目为 Unicode 时,这应该可以工作。
CString具有针对LPCSTR和LPCWSTR的构造函数和赋值运算符,因此永远不需要调用WideCharToMultiByte,并且在Unicode或非Unicode模式下无法出现转换错误。
您只需使用以下方式分配字符串:
csError = bstrErr.GetBSTR();
或使用构造函数 CString csError( bstrErr.GetBSTR() );
我正在使用GetBSTR。 这与将bstrErr强制转换为(LPCWSTR)相同,但我更喜欢它的可读性。
BSTR myBSTRVal;
CString BSTRasCString("")
char szValue[MAX_PATH] = "";
// This will map the BSTR to a new character string (szValue)
WideCharToMultiByte(CP_ACP, 0, myBSTRVal, -1, szValue, sizeof(szValue), NULL,
NULL);
BSTRasCString.Format("%s", szValue);
BSTRasCString.TrimLeft();
BSTRasCString.TrimRight();
CStringT
,CString
,CStringA
和CStringW
:
CStringT
是一个复杂的类模板,基于任意字符类型和辅助类模板来管理存储和特性。CString
是模板类的typedef,使用TCHAR
字符类型。如果宏UNICODE
被设置,则TCHAR
是通用类型,解析为wchar
,否则解析为char
。CStringA
是模板类的typedef,内部使用窄字符类型char
。CStringW
是模板类的typedef,内部使用宽字符类型wchar_t
。我在代码中从不使用CString
,而是总是使用显式类CStringA
或CStringW
。
CString*
类具有接受窄字符串和宽字符串的构造函数。对于_bstr_t
也是如此。类型为BSTR
的字符串必须由函数SysAllocString()
分配,该函数需要一个OLECHAR
字符串,因此在Win32/64中是宽字符串。如果您想将包含Unicode的_bstr_t
复制到CStringA
中,则必须将其转换为UTF8。我使用CW2A
和CA2W
类进行转换。
在Word插件的以下事件函数中,我展示了这些类型的使用:
STDMETHODIMP CConnect::TestButtonClicked(IDispatch* Command)
{
BSTR smi = SysAllocString(L"Two smileys in a row: ");
_bstr_t ley = L"\U0001F60A";
/* Either using CStringA, UTF16 -> UTF8 conversion needed */
CStringA smiley(CW2A(smi, CP_UTF8));
smiley += CW2A(ley.GetBSTR(), CP_UTF8);
MessageBoxW(NULL, CA2W(smiley, CP_UTF8), L"Example", MB_OK | MB_TASKMODAL);
/* Or using CStringW, use ctor and += operator directly
CStringW smiley = smi;
smiley += ley.GetBSTR();
MessageBoxW(NULL, smiley, L"Example", MB_OK | MB_TASKMODAL);
*/
SysFreeString(smi);
return S_OK;
}