1

我对 COM 字符串分配感到困惑。以下哪个字符串赋值是正确的。为什么?

CComBSTR str;
.
.
Obj->str = L""  //Option1

或者应该是

Obj->str = CComBSTR(L"")  //Option2

是什么原因

4

4 回答 4

4

一个真实BSTR的是:

  • 从 COM 堆中临时分配(通过SysAllocString()和族)
  • 一种数据结构,其中字符串数据前面有其长度,存储在 32 位值中。
  • 作为指向该数据结构的第五个字节的指针传递,字符串数据所在的位置。

请参阅文档: MSDN:BSTR

大多数接受 a 的函数BSTR在传递 BSTR 时不会崩溃,创建了简单的赋值。这会导致混淆,因为人们观察似乎是工作代码,他们从中推断出 aBSTR可以像 any 一样被初始化WCHAR *。这种推论是不正确的。

只有 realBSTRs可以传递给 OLE 自动化接口。

通过使用CComBSTR()调用 的构造函数,SysAllocString()您的代码将创建一个真实的BSTR. CComBSTR()析构函数将负责将分配的存储通过SysFreeString().

如果您将 传递CComBSTR()给拥有所有权的 API,请务必调用该.Detach()方法以确保BSTR未释放 。 BSTRs没有引用计数(与 COM 对象不同),因此尝试BSTR多次释放 a 将崩溃。

于 2009-11-16T23:27:08.153 回答
3

如果你使用str = CComBSTR(L"")你使用构造函数

CComBSTR( LPCSTR pSrc );

如果你使用str = L""你使用赋值运算符

CComBSTR& operator =(LPCSTR pSrc);

他们都将正确初始化 CComBSTR 对象。

于 2009-11-16T23:03:38.637 回答
1

就个人而言,我更喜欢选项 1,因为这不需要构造新CComBSTR对象。(当然,他们的代码是否在幕后这样做是另一回事。)

于 2009-11-16T23:02:55.253 回答
1

选项 1 是首选,因为它只对字符串进行一次分配,而选项 2 则进行 2 (不承受无缘无故创建新的临时对象)。与 VC++ 中的 bstr_t 类型不同,ATL 不执行引用计数字符串,因此它将复制整个字符串。

于 2009-11-16T23:05:42.450 回答