在 C++ 中使用 COM 时,字符串通常是 BSTR
数据类型。有人可以使用 BSTR
包装器,例如 CComBSTR
或 MS 的 CString
。但是因为我不能在 MinGW 编译器中使用 ATL 或 MFC,是否有标准代码片段将 BSTR
转换为 std::string
(或 std::wstring
) 反之亦然?
BSTR
是否还有一些类似于 CComBSTR
的非 MS 包装器?
更新
感谢所有以任何方式帮助我的人!正因为没有人解决 BSTR
和 std::string
之间的转换问题,我想在这里提供一些关于如何做到这一点的线索。
以下是我用来将 BSTR
转换为 std::string
和 std::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;
}
最佳答案
BSTR
至std::wstring
:
// given BSTR bs
assert(bs != nullptr);
std::wstring ws(bs, SysStringLen(bs));
std::wstring
至BSTR
:
// given std::wstring ws
assert(!ws.empty());
BSTR bs = SysAllocStringLen(ws.data(), ws.size());
文档引用:
关于c++ - BSTR 到 std::string (std::wstring),反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284524/