如何在 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 引用参数的方法.
I am working on a COM dll. I wish to convert a BSTR to a std::string to pass to a method that takes a const reference parameter.
似乎使用 _com_util::ConvertBSTRToString() 获得 BSTR 的 char* 等价物是一种合适的方法.但是,API 文档很少,而且实现可能存在错误:
It seems that using _com_util::ConvertBSTRToString() to get the char* equivalent of the BSTR is an appropriate way to do so. However, the API documentation is sparse, and the implementation is potentially buggy:
http://msdn.microsoft.com/en-us/library/ewezf1f6(v=vs.100).aspxhttp://www.codeproject.com/Articles/1969/BUG-in-_com_util-ConvertStringToBSTR-and-_com_util
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() 的替代方案的优缺点是什么,最好基于标准方法和类?
What are the pros and cons of alternatives to using ConvertBSTRToString(), preferrably based on standard methods and classes?
推荐答案
您可以自己完成此操作.如果可能,我更喜欢转换为目标 std::string
.如果没有,请使用临时值覆盖.
You can do this yourself. I prefer to convert into the target std::string
if possible. If not, use a temp-value override.
// 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);
反正就是这样.
这篇关于如何在 Visual Studio C++ 2010 中将 BSTR 转换为 std::string?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!