簡體   English   中英

如何在Visual Studio C ++ 2010中將BSTR轉換為std :: string?

[英]How to convert BSTR to std::string in Visual Studio C++ 2010?

我正在研究COM dll。 我希望將BSTR轉換為std :: string以傳遞給采用const引用參數的方法。

似乎使用_com_util :: ConvertBSTRToString()來獲取BSTR的char *等價物是一種合適的方法。 但是,API文檔很稀疏,實現可能有問題:

http://msdn.microsoft.com/en-us/library/ewezf1f6(v=vs.100).aspx http://www.codeproject.com/Articles/1969/BUG-in-_com_util-ConvertStringToBSTR-and- _com_util

例:

#include <comutil.h>
#include <string>

void Example(const std::string& Str) {}

int main()
{
    BSTR BStr = SysAllocString("Test");
    char* CharStr = _com_util::ConvertBSTRToString(BStr);
    if(CharStr != NULL)
    {
        std::string StdStr(CharStr);
        Example(StdStr);
        delete[] CharStr;
    }
    SysFreeString(BStr);
}

使用ConvertBSTRToString()的替代方案有哪些優缺點,最好是基於標准方法和類?

你可以自己做。 如果可能的話,我更喜歡轉換為目標std::string 如果不是,請使用臨時值覆蓋。

// convert a BSTR to a std::string. 
std::string& BstrToStdString(const BSTR bstr, std::string& dst, int cp = CP_UTF8)
{
    if (!bstr)
    {
        // define NULL functionality. I just clear the target.
        dst.clear();
        return dst;
    }

    // request content length in single-chars through a terminating
    //  nullchar in the BSTR. note: BSTR's support imbedded nullchars,
    //  so this will only convert through the first nullchar.
    int res = WideCharToMultiByte(cp, 0, bstr, -1, NULL, 0, NULL, NULL);
    if (res > 0)
    {
        dst.resize(res);
        WideCharToMultiByte(cp, 0, bstr, -1, &dst[0], res, NULL, NULL);
    }
    else
    {    // no content. clear target
        dst.clear();
    }
    return dst;
}

// conversion with temp.
std::string BstrToStdString(BSTR bstr, int cp = CP_UTF8)
{
    std::string str;
    BstrToStdString(bstr, str, cp);
    return str;
}

調用為:

BSTR bstr = SysAllocString(L"Test Data String")
std::string str;

// convert directly into str-allocated buffer.
BstrToStdString(bstr, str);

// or by-temp-val conversion
std::string str2 = BstrToStdString(bstr);

// release BSTR when finished
SysFreeString(bstr);

無論如何,這樣的事情。

簡單的方法

BSTR => CStringW => CW2A => std :: string。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM