【发布时间】:2023-04-01 23:00:02
【问题描述】:
我有一个_bstr_t 变量bstrErr,我有一个CString 变量csError。如何将bstrErr 中的值设置为csError?
【问题讨论】:
标签: c++ com mfc visual-c++ bstr
我有一个_bstr_t 变量bstrErr,我有一个CString 变量csError。如何将bstrErr 中的值设置为csError?
【问题讨论】:
标签: c++ com mfc visual-c++ bstr
难道就不能投吗:
_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是一个泛型类型,如果设置了宏UNICODE,则解析为wchar,否则解析为char。CStringA 类是模板类的 typedef,它在内部使用窄字符类型 char。 CStringW 类是在内部使用宽字符类型wchar_t 的模板类的 typedef。 我从不在代码中使用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;
}
【讨论】: