为什么使用CComBSTR而不是仅传递WCHAR *?

时间:2009-11-16 16:45:45

标签: visual-c++ com com-interop atl bstr

我是COM的新手。更换的优势究竟是什么:

L"String"

CComBSTR(L"String")

我可以在.NET应用程序的COM部分看到一个更改列表,其中所有字符串都以这种方式替换。想知道这有什么需要。

2 个答案:

答案 0 :(得分:3)

BSTRWCHAR[]不同。 BSTR值以其长度为前缀,以及以null结尾。

如果你正在处理用C或C ++编写的进程内对象,你通常会逃避这一点,因为C / C ++代码可能会认为你的BSTR是一个以null结尾的宽字符串

另一方面,如果您正在处理进程外/跨机器对象,代理/存根编组代码将假设您确实通过了BSTR,并期望找到一个长度字段(它需要知道要编组多少数据)。这将是非常错误的。

简而言之:如果某些东西需要BSTR,请调用SysAllocString(或CComBSTR或CString :: AllocSysString)。

答案 1 :(得分:0)

您可以将L“Something”传递给声明为期待BSTR的COM方法,但是您永远不应该这样做。

惯例是使用SysAllocString()系列函数之一分配BSTR,并且任何接收BSTR的人都可以(并且应该)在想要找到字符串长度时调用SysStringLen()。 SysStringLen()依赖于使用SysAllocString()系列函数分配的BSTR(因为它使用由这些函数分配和初始化的额外数据),如果违反了该要求,程序将遇到未定义的行为。

直接使用SysAllocString()还需要调用SysFreeString()来释放字符串(否则会泄漏内存),因此会导致大量代码并可能导致错误。更好的方法是使用包装类(如CComBSTR或_bstr_t)来管理BSTR - 它们会在必要时调用SysAllocString()/ SysFreeString()(当然,除非你滥用它们)。