我对 COM 字符串分配感到困惑。以下哪个字符串赋值是正确的。为什么?
CComBSTR str;
.
.
Obj->str = L"" //Option1
或者应该是
Obj->str = CComBSTR(L"") //Option2
是什么原因
我对 COM 字符串分配感到困惑。以下哪个字符串赋值是正确的。为什么?
CComBSTR str;
.
.
Obj->str = L"" //Option1
或者应该是
Obj->str = CComBSTR(L"") //Option2
是什么原因
一个真实BSTR
的是:
SysAllocString()
和族)请参阅文档: MSDN:BSTR
大多数接受 a 的函数BSTR
在传递 BSTR 时不会崩溃,创建了简单的赋值。这会导致混淆,因为人们观察似乎是工作代码,他们从中推断出 aBSTR
可以像 any 一样被初始化WCHAR *
。这种推论是不正确的。
只有 realBSTRs
可以传递给 OLE 自动化接口。
通过使用CComBSTR()
调用 的构造函数,SysAllocString()
您的代码将创建一个真实的BSTR
. CComBSTR()
析构函数将负责将分配的存储通过SysFreeString()
.
如果您将 传递CComBSTR()
给拥有所有权的 API,请务必调用该.Detach()
方法以确保BSTR
未释放 。 BSTRs
没有引用计数(与 COM 对象不同),因此尝试BSTR
多次释放 a 将崩溃。
就个人而言,我更喜欢选项 1,因为这不需要构造新CComBSTR
对象。(当然,他们的代码是否在幕后这样做是另一回事。)
选项 1 是首选,因为它只对字符串进行一次分配,而选项 2 则进行 2 (不承受无缘无故创建新的临时对象)。与 VC++ 中的 bstr_t 类型不同,ATL 不执行引用计数字符串,因此它将复制整个字符串。