【发布时间】:2012-11-23 09:55:55
【问题描述】:
我正在处理一个 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() 的替代方法的优缺点是什么,最好基于标准方法和类?
【问题讨论】:
-
垃圾进,垃圾出。您可以使用 WideCharToMultiByte() 编写自己的转换器,并在获得 1 兆字节的字符串时做一些更合理的事情。就像抛出异常一样。
-
澄清一下,这是一个关于文档记录不佳的 MS comsupp-lib API 的问题吗?还是您在问自己如何做到这一点? (或两者兼而有之?)
-
@WhozCraig:我想两者都有,所以也许我应该把它们分成两个单独的问题,我会编辑这个以专注于我的目标而不是我的方法。
-
请注意,在那个 codeproject 页面中,作者抱怨一个函数分配“两倍于 [it] 需要的内存”,因为他们分配了
wcslen(str)*2。关于宽字符的宽度似乎存在误解。这篇文章应该与一些盐一起服用,可能是平时的两倍。
标签: c++ api visual-studio-2010 com