在工程已经设置为multi-byte character的情况下出现"字符集"错误。

时间:2022-09-22 20:53:38

代码:
...
BSTR bstrVal;
CString strArg1 = bstrVal;
...

编译错误:
error C2440: 'initializing' : cannot convert from 'BSTR' to 'ATL::CStringT<BaseType,StringTraits>'
        with
        [
            BaseType=char,
            StringTraits=StrTraitMFC<char>
        ]
        Constructor for class 'ATL::CStringT<BaseType,StringTraits>' is declared 'explicit'
        with
        [
            BaseType=char,
            StringTraits=StrTraitMFC<char>
        ]

1、在工程已经设置为《multi-byte character》的情况下出现这个错误,但是CString strArg1(bstrVal);这样写,又不会报错,为什么?工程设置为unicode,则没有错误。

2、有人说应该用MultiByteToWideChar, WideCharToMultiByte把bstrVal转掉。但是如果直接CString strArg1(bstrVal);这样写,会有问题吗?

3、还有,可能是这个工程错误的设置了什么属性,因为我把代码提取出来新建一个工程,就不会有这样的错误。


网上关于字符集问题的帖子看了挺多了,但是没找到这个问题的原因

6 个解决方案

#1


BSTR bstrVal;
//CString    strArg1    = bstrVal;
strArg1.SetSysString(&bstrVal);

#3


下班了,顶

#4


引用 1 楼 tttyd 的回复:
C/C++ code
BSTR bstrVal;
//CString    strArg1    = bstrVal;
strArg1.SetSysString(&amp;bstrVal);


出现异常

#5


_bstr_t 试试看

#6


楼主的意思是:

为什么
_tchar str="...";
CString strArg1 = str; 正确,

BSTR bstrVal;
CString    strArg1    = bstrVal;
就出错了。

原因是从内存结构上看,BSTR与wchar_t是完全相同的,但在编译器看来,BSTR与wchar_t是两种不同的类型。

CString有到wchar_t的赋值函数(定义大约为CString &operater=(LPCTSTR);),却没有到BSTR的赋值函数。

可以直接用CString    strArg1    = (LPCWSTR)bstrVal;来解决。

#1


BSTR bstrVal;
//CString    strArg1    = bstrVal;
strArg1.SetSysString(&bstrVal);

#2


#3


下班了,顶

#4


引用 1 楼 tttyd 的回复:
C/C++ code
BSTR bstrVal;
//CString    strArg1    = bstrVal;
strArg1.SetSysString(&amp;bstrVal);


出现异常

#5


_bstr_t 试试看

#6


楼主的意思是:

为什么
_tchar str="...";
CString strArg1 = str; 正确,

BSTR bstrVal;
CString    strArg1    = bstrVal;
就出错了。

原因是从内存结构上看,BSTR与wchar_t是完全相同的,但在编译器看来,BSTR与wchar_t是两种不同的类型。

CString有到wchar_t的赋值函数(定义大约为CString &operater=(LPCTSTR);),却没有到BSTR的赋值函数。

可以直接用CString    strArg1    = (LPCWSTR)bstrVal;来解决。