BSTR в std :: string ( std :: wstring) и наоборот

При работе с COM в C ++ строки обычно имеют тип данных BSTR . Кто-то может использовать оболочку BSTR , например CComBSTR или MS CString . Но поскольку я не могу использовать 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;
}
63
задан ezpresso 12 January 2012 в 21:51
поделиться