C++ 从_bstr_t到std::string的转换
我只是想把_bstr_t转换成std::string 我找到了一篇关于这个问题的帖子(),并完全按照描述的那样做了,但它引发了一个异常 这就是我所做的:C++ 从_bstr_t到std::string的转换,c++,string,type-conversion,C++,String,Type Conversion,我只是想把_bstr_t转换成std::string 我找到了一篇关于这个问题的帖子(),并完全按照描述的那样做了,但它引发了一个异常 这就是我所做的: _bstr_t BString; std::string STDString((char *) BString); 我得到了这个错误: 0CxC00000005: Access violation reading location 0x00000000 具体来说,在查看调用堆栈后,iosfwd.h中出现错误: static size_t _
_bstr_t BString;
std::string STDString((char *) BString);
我得到了这个错误:
0CxC00000005: Access violation reading location 0x00000000
具体来说,在查看调用堆栈后,iosfwd.h中出现错误:
static size_t __CLRCALL_OR_CDECL length(const _Elem *_First)
{ // find length of null-terminated string
return (*_First == 0 ? 0
: _CSTD strlen(_First));
}
将_bstr_t转换为std::string..的正确方法是什么
谢谢
b字符串
可以保存一个null
值,而std::string
不能,所以您必须对此进行说明
const char* buf = BString;
int bstrlen = BString.length();
std::string STDString( buf?buf:"", bstrlen);
请注意,BString可能在内部使用UTF16,因此char*重载将使用当前区域设置来选择字节编码,可能是CP-1252,导致某些字符无法正确转换 @MooingDuck刚刚编辑了代码。。是的,请注意,
BString
可能在内部使用UTF16,因此char*
重载将使用当前区域设置来选择字节编码,可能是CP-1252,导致某些字符无法正确转换。您链接到的帖子可能全是废话,或者使用/clr
编译,以某种方式使其中的代码正常工作。\u bstr\u t
是COMbstr
的包装器,它将字符串的长度存储在前4个字节中。所以演员组不会做这项工作。编辑:啊,我知道它是怎么工作的<代码>\u bstr\u t定义为char*
和whcar\u t*
@Praetorian Oops,我误读并撤回了投票结果。再次说明:@πντα的可能重复ῥεῖ: 该页面上的每个答案都有与此问题遇到的相同的错误。由于那一页上没有答案回答这个问题,我犹豫着结束这一页,因为这是一个骗局。也许一旦该页面有了更好的答案。不需要在条件中进行初始转换。@KonradRudolph:我没有测试过,但由于它有四个在布尔上下文中有效的隐式转换,我认为不进行转换将导致“歧义”编译器错误。@KonradRudolph“错误C2440:'?':无法从'\u bstr\u t'转换为'bool'用户定义的不明确转换
”