首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >BSTR到std::string (std::wstring),反之亦然

BSTR到std::string (std::wstring),反之亦然
EN

Stack Overflow用户
提问于 2011-06-09 04:02:09
回答 3查看 109K关注 0票数 73

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

是否也有一些类似于CComBSTRBSTR非MS包装器

更新

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

下面是我分别用于将BSTR转换为std::string和将std::string转换为BSTR的函数:

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

发布于 2014-08-15 20:33:51

你也可以这样做

代码语言:javascript
复制
#include <comdef.h>

BSTR bs = SysAllocString("Hello");
std::wstring myString = _bstr_t(bs, false); // will take over ownership, so no need to free

或者std::string,如果您愿意

编辑:如果您的原始字符串包含多个embedded \0,则此方法将不起作用。

票数 10
EN

Stack Overflow用户

发布于 2017-06-27 21:49:31

有一个名为_bstr_t的c++类。它有一些有用的方法和一组重载操作符。

例如,你可以很容易地从const wchar_t *const char *中赋值,只需执行_bstr_t bstr = L"My string";,然后您可以将其转换回执行const wchar_t * s = bstr.operator const wchar_t *();。您甚至可以将其转换回常规的char const char * c = bstr.operator char *();,然后只需使用const wchar_t *const char *来初始化新的std::wstring oe std::string

票数 9
EN

Stack Overflow用户

发布于 2011-06-09 04:38:47

只需将BSTR直接传递给wstring构造函数,它与wchar_t*兼容

代码语言:javascript
复制
BSTR btest = SysAllocString(L"Test");
assert(btest != NULL);
std::wstring wtest(btest);
assert(0 == wcscmp(wtest.c_str(), btest));

将BSTR转换为std::string需要先转换为char*。这是有损的,因为BSTR存储了一个utf-16编码的Unicode字符串。除非你想用utf-8编码。您将在ICU库中找到执行此操作的帮助器方法,以及操作结果字符串。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6284524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档