73 votes

BSTR à std :: string (std :: wstring) et vice versa

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;
}

10voto

Claptrap Points 21299

Tu pourrais aussi faire ça

 #include <comdef.h>

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

ou std :: string si vous préférez

4voto

Hans Passant Points 475940

Passez simplement le BSTR directement au constructeur wstring, il est compatible avec un wchar_t *:

 BSTR btest = SysAllocString(L"Test");
assert(btest != NULL);
std::wstring wtest(btest);
assert(0 == wcscmp(wtest.c_str(), btest));
 

La conversion de BSTR en std :: string nécessite d'abord une conversion en char *. Cela entraîne des pertes, car BSTR stocke une chaîne Unicode codée en utf-16. Sauf si vous voulez encoder en utf-8. Vous trouverez des méthodes d'assistance pour le faire, ainsi que la manipulation de la chaîne résultante, dans la bibliothèque ICU.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X