c++ - 如何在 Visual Studio C++ 2010 中将 BSTR 转换为 std::string?

标签 c++ api visual-studio-2010 com

我正在处理 COM dll。我希望将 BSTR 转换为 std::string 以传递给采用常量引用参数的方法。

似乎使用 _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);

无论如何,类似的东西。

关于c++ - 如何在 Visual Studio C++ 2010 中将 BSTR 转换为 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13725519/

相关文章:

javascript - 如何从 jquery ajax 请求返回数据?

java - 异步 API 性能更差

c++ - 在 VS2010 中动态链接 Boost 1.51.0 时链接器错误 LNK2019

visual-studio-2010 - 使用 sandcaSTLe help builder 构建 visual studio 2010 .NET 4.0 项目时出错

c# - WSDL:在 VS 2010 上添加服务引用 C# 时出错

c++ - 我真的必须链接 Ws2_32.lib 吗?

c++ - c++中下列表达式的含义是什么

c++ - 我可以列表初始化一个只 move 类型的 vector 吗?

c++ - 有没有一种方法可以排除C++数组中的行和列?

api - 从 sumo 逻辑下载数据时 curl 失败