我有一个_bstr_t
变量bstrErr
,我有一个CString
变量csError
。如何设置进来的bstrErr
值csError
?
5 回答
难道不能只投它:
_bstr_t b("Steve");
CString cs;
cs = (LPCTSTR) b;
我认为当项目是 Unicode 时这应该可以工作。
CString 具有 LPCSTR 和 LPCWSTR 的构造函数和赋值运算符,因此永远不需要调用 WideCharToMultiByte,并且在 unicode 或非 unicode 模式下不会出现转换错误。
您可以这样分配字符串:
csError = bstrErr.GetBSTR();
或者使用构造函数 CString csError( bstrErr.GetBSTR() );
我正在使用 GetBSTR。这与使用 (LPCWSTR) 强制转换 bstrErr 相同,但我更喜欢它的易读性。
如果您为 Unicode 编译 - 只需将封装的 BSTR 分配给 CString。如果为 ANSI 编译,则必须使用 WideCharToMultiByte() 进行转换。
另请注意,封装的 BSTR 可以为空,对应于空字符串。如果您不注意这一点,您的程序将遇到未定义的行为。
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
是使用TCHAR
字符类型的模板类的 typedef。TCHAR
是一个泛型类型,wchar
如果设置了宏,UNICODE
则解析为,否则解析为char
. - 该类
CStringA
是在内部使用窄字符类型的模板类的 typedefchar
。 - 该类
CStringW
是在内部使用宽字符类型的模板类的 typedefwchar_t
。
我从不CString
在代码中使用,而是总是使用显式类CStringA
或CStringW
. 这些类CString*
具有接受窄字符串和宽字符串的构造函数。对于_bstr_t
. 类型的字符串BSTR
必须由 SysAllocString()
需要OLECHAR
字符串的函数分配,因此在 Win32/64 中是宽字符串。如果要将_bstr_t
包含 Unicode 的 a 复制到 a 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;
}