c++ - BSTR 到 std::string (std::wstring),反之亦然

标签 c++ string com

在 C++ 中使用 COM 时,字符串通常是 BSTR 数据类型。有人可以使用 BSTR 包装器,例如 CComBSTR 或 MS 的 CString。但是因为我不能在 MinGW 编译器中使用 ATL 或 MFC,是否有标准代码片段将 BSTR 转换为 std::string (或 std::wstring ) 反之亦然?

BSTR 是否还有一些类似于 CComBSTR 的非 MS 包装器?

更新

感谢所有以任何方式帮助我的人!正因为没有人解决 BSTRstd::string 之间的转换问题,我想在这里提供一些关于如何做到这一点的线索。

以下是我用来将 BSTR 转换为 std::stringstd::string 转换为 BSTR分别:

std::string ConvertBSTRToMBS(BSTR bstr)
{
    int wslen = ::SysStringLen(bstr);
    return ConvertWCSToMBS((wchar_t*)bstr, wslen);
}

std::string ConvertWCSToMBS(const wchar_t* pstr, long wslen)
{
    int len = ::WideCharToMultiByte(CP_ACP, 0, pstr, wslen, NULL, 0, NULL, NULL);

    std::string dblstr(len, '\0');
    len = ::WideCharToMultiByte(CP_ACP, 0 /* no flags */,
                                pstr, wslen /* not necessary NULL-terminated */,
                                &dblstr[0], len,
                                NULL, NULL /* no default char */);

    return dblstr;
}

BSTR ConvertMBSToBSTR(const std::string& str)
{
    int wslen = ::MultiByteToWideChar(CP_ACP, 0 /* no flags */,
                                      str.data(), str.length(),
                                      NULL, 0);

    BSTR wsdata = ::SysAllocStringLen(NULL, wslen);
    ::MultiByteToWideChar(CP_ACP, 0 /* no flags */,
                          str.data(), str.length(),
                          wsdata, wslen);
    return wsdata;
}

最佳答案

BSTRstd::wstring :

// given BSTR bs
assert(bs != nullptr);
std::wstring ws(bs, SysStringLen(bs));

 
std::wstringBSTR :

// given std::wstring ws
assert(!ws.empty());
BSTR bs = SysAllocStringLen(ws.data(), ws.size());

文档引用:

  1. std::basic_string<typename CharT>::basic_string(const CharT*, size_type)
  2. std::basic_string<>::empty() const
  3. std::basic_string<>::data() const
  4. std::basic_string<>::size() const
  5. SysStringLen()
  6. SysAllocStringLen()

关于c++ - BSTR 到 std::string (std::wstring),反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284524/

相关文章:

c++ - 在这种情况下我应该使用引用成员吗?

c++ - 取消引用指向未知类型变量的指针

java - 这个生成了多少 Java 对象 - new String ("abcd")

java - 在 SQL 查询中使用格式化字符串作为日期

com - 当调用 COM/ActiveX 方法时,NULL 的 Matlab 等价物是什么?

c++ - 对 OnResetDevice() 和 OnLostDevice() 的一般调用

c++ - 异或运算直觉

c++ - sprintf 缓冲区全局数据溢出 - 如何检测它,Windows

java - 如何从另一个字符串中获取一个字符串值

com - 是否有列出从 DLL 导出的方法的工具?