在C++中使用COM时,字符串通常是BSTR
数据类型.有人可以使用BSTR
包装器CComBSTR
或MS CString
.但是因为我不能在MinGW编译器中使用ATL或MFC,是否有标准代码片段转换BSTR
为std::string
(或std::wstring
),反之亦然?
是否还有一些BSTR
类似的非MS包装CComBSTR
?
感谢所有以任何方式帮助过我的人!仅仅因为没有人解决过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;
}
Run Code Online (Sandbox Code Playgroud)
ild*_*arn 88
BSTR
到std::wstring
:
// given BSTR bs
assert(bs != nullptr);
std::wstring ws(bs, SysStringLen(bs));
Run Code Online (Sandbox Code Playgroud)
std::wstring
到BSTR
:
// given std::wstring ws
assert(!ws.empty());
BSTR bs = SysAllocStringLen(ws.data(), ws.size());
Run Code Online (Sandbox Code Playgroud)
Doc refs:
std::basic_string<typename CharT>::basic_string(const CharT*, size_type)
std::basic_string<>::empty() const
std::basic_string<>::data() const
std::basic_string<>::size() const
SysStringLen()
SysAllocStringLen()
And*_*rsK 11
你也可以这样做
#include <comdef.h>
BSTR bs = SysAllocString("Hello");
std::wstring myString = _bstr_t(bs, false); // will take over ownership, so no need to free
Run Code Online (Sandbox Code Playgroud)
或者std :: string如果你愿意的话
小智 8
有一个名为_bstr_t
. 它有有用的方法和重载运算符的集合。
例如,您可以轻松地从 aconst wchar_t *
或 a const char *
just doing分配,_bstr_t bstr = L"My string";
然后您可以将其转换回做const wchar_t * s = bstr.operator const wchar_t *();
。您甚至可以将其转换回常规字符,const char * c = bstr.operator char *();
然后您可以使用 theconst wchar_t *
或 theconst char *
来初始化一个新的std::wstring
oe std::string
。