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
    是使用
    TCHAR
    字符类型的模板类的typedef
    TCHAR
    是一种通用类型,如果宏
    UNICODE
    设置,则解析为
    wchar
    ,否则解析为
    char
  • CStringA
    是模板类的typedef,它在内部使用窄字符类型
    char
  • CStringW
    是模板类的typedef,它在内部使用宽字符类型
    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)“我能回答的两个笑脸应该不仅仅包括代码。你做了什么改变/做了什么?为什么这样做?-来自评论