【问题标题】:Conversion from _bstr_t to std::string从 _bstr_t 到 std::string 的转换
【发布时间】:2014-08-23 18:58:15
【问题描述】:

我只是想将 _bstr_t 转换为 std::string..

我发现了一篇关于这个问题的帖子 (LINK),并且完全按照描述进行操作,但它引发了异常..

这就是我所做的:

_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.. 的正确方法是什么?

谢谢

【问题讨论】:

  • @MooingDuck 刚刚编辑了代码.. 是的,它是_bstr_t
  • 注意BString内部可能使用UTF16,所以char*重载会使用当前locale选择字节编码,可能是CP-1252,导致部分字符无法转换正确。
  • 要么你链接到的帖子充满了废话,要么用/clr 编译以某种方式使那里的代码工作。 _bstr_t 是 COM BSTR 的包装器,它将字符串的长度存储在前 4 个字节中。因此,演员不会完成这项工作。编辑:啊,我知道它是如何工作的......_bstr_timplicit conversion operators 定义为char *whcar_t *
  • @Praetorian 哎呀,我误读并撤回了接近投票。再次:BSTR to std::string (std::wstring) and vice versa的可能重复项
  • @πάνταῥεῖ:该页面上的每个答案都与此问题遇到的错误相同。由于该页面上没有答案可以回答这个问题,因此我不愿将其关闭,因为这是一个骗局。也许一旦该页面有更好的答案。

标签: c++ string type-conversion


【解决方案1】:

BString 可以保存 null 值,而 std::string 不能,因此您必须考虑到这一点。

const char* buf = BString;
int bstrlen = BString.length();
std::string STDString( buf?buf:"", bstrlen);

请注意,BString 内部可能使用 UTF16,因此 char* 重载将使用当前语言环境来选择字节编码,可能是 CP-1252,导致某些字符无法正确转换。

【讨论】:

  • 不需要在条件中进行初始转换。
  • @KonradRudolph:我没有测试过,但由于它有四个在布尔上下文中有效的隐式转换,我认为没有强制转换会导致“歧义”编译器错误。跨度>
  • @KonradRudolph "error C2440: '?' : cannot convert from '_bstr_t' to 'bool' Ambiguous user-defined-conversion" rextester.com/HPES3175
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多