C++ 如何将_bstr_\t转换为CString
我有一个C++ 如何将_bstr_\t转换为CString,c++,com,mfc,visual-c++,bstr,C++,Com,Mfc,Visual C++,Bstr,我有一个\u bstr\t变量bstrErr,我有一个CString变量csError。如何将bstrErr中的值设置为csError?是否不可能仅强制转换它: _bstr_t b("Steve"); CString cs; cs = (LPCTSTR) b; 我认为当项目是Unicode时,这应该可以工作。如果您为Unicode编译,只需将封装的BSTR分配给CString即可。如果为ANSI编译,则必须使用WideCharToMultiByte()进行转换 还要注意,封装的BSTR可以是空
\u bstr\t
变量bstrErr
,我有一个CString
变量csError
。如何将bstrErr
中的值设置为csError
?是否不可能仅强制转换它:
_bstr_t b("Steve");
CString cs;
cs = (LPCTSTR) b;
我认为当项目是Unicode时,这应该可以工作。如果您为Unicode编译,只需将封装的BSTR分配给CString即可。如果为ANSI编译,则必须使用WideCharToMultiByte()进行转换
还要注意,封装的BSTR可以是空的,它对应于一个空字符串。如果您不注意这一点,您的程序将运行到未定义的行为中。CString对LPCSTR和LPCWSTR都有构造函数和赋值运算符,因此永远不需要调用WideCharToMultiByte,并且在unicode或非unicode模式下也不会出现转换错误 您可以通过以下方式分配字符串: csError=bstrErr.GetBSTR() 或者使用构造函数 CString csError(bstrErr.GetBSTR())
我正在使用GetBSTR。这与使用(LPCWSTR)铸造bstrErr是一样的,但我更喜欢它的易读性。
CStringT
、CString
、CStringA
和CStringW
:
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
字符类型的模板类的typedefTCHAR
是一种通用类型,如果宏TCHAR
设置,则解析为UNICODE
,否则解析为wchar
char
- 类
是模板类的typedef,它在内部使用窄字符类型CStringA
李>char
- 类
是模板类的typedef,它在内部使用宽字符类型CStringW
李>wchar\u t
CString
,而是始终使用显式类CStringA
或CStringW
。
类CString*
具有接受窄字符串和宽字符串的构造函数。这同样适用于\bstr\t
。类型为BSTR
的字符串必须由函数SysAllocString()
分配,该函数需要OLECHAR
字符串,因此在Win32/64中需要宽字符串。如果要将包含Unicode的\bstr\t
复制到CStringA
必须将其转换为UTF8。我使用类CW2A
和CA2W
进行转换
在Word加载项的以下事件函数中,我展示了这些类型的用法:
STDMETHODIMP CConnect::TestButtonClicked(IDispatch*命令)
{
BSTR smi=SysAllocString(L)“我能回答的两个笑脸应该不仅仅包括代码。你做了什么改变/做了什么?为什么这样做?-来自评论