или std :: string, если вы предпочитаете
аботе с COM в C ++ строки обычноBSTR
тип данных. Кто-то может использоватьBSTR
как оберткаCComBSTR
или MSCString
, Но поскольку я не могу использовать ATL или MFC в компиляторе MinGW, есть ли стандартный фрагмент кода для преобразованияBSTR
вstd::string
(или жеstd::wstring
) и наоборот?
Существуют ли также не-MS обертки дляBSTR
похожий на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;
}