Tout en travaillant avec COM en C++, les cordes sont généralement d' BSTR
type de données. Quelqu'un peut utiliser BSTR
wrapper comme CComBSTR
ou em CString
. Mais parce que je ne peux pas utiliser ATL ou MFC dans le compilateur MinGW, est-il standard extrait de code pour convertir BSTR
de std::string
(ou std::wstring
), et vice-versa?
Sont-il également des non-MS des wrappers pour BSTR
similaire à l' CComBSTR
?
Mise à jour
Merci à tous ceux qui m'ont aidé en quelque sorte! Tout simplement parce que personne n'a abordé la question de la conversion entre BSTR
et std::string
, je voudrais présenter ici quelques indices sur la façon de le faire.
Ci-dessous sont les fonctions que j'utilise pour convertir BSTR
de std::string
et std::string
de BSTR
respectivement:
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;
}