ComBSTR 分配
Posted
技术标签:
【中文标题】ComBSTR 分配【英文标题】:ComBSTR assignment 【发布时间】:2010-12-17 06:03:25 【问题描述】:我对 COM 字符串分配感到困惑。以下哪个字符串赋值是正确的。为什么?
CComBSTR str;
.
.
Obj->str = L"" //Option1
或者应该是
Obj->str = CComBSTR(L"") //Option2
是什么原因
【问题讨论】:
【参考方案1】:就个人而言,我更喜欢选项 1,因为这不需要构造新的 CComBSTR
对象。 (当然,他们的代码是否在幕后这样做是另一回事。)
【讨论】:
【参考方案2】:如果您使用str = CComBSTR(L"")
,则使用constructor:
CComBSTR( LPCSTR pSrc );
如果您使用str = L""
,则使用assignment operator:
CComBSTR& operator =(LPCSTR pSrc);
它们都会正确初始化 CComBSTR 对象。
【讨论】:
【参考方案3】:选项 1 是首选,因为它只对字符串进行一次分配,而选项 2 则进行 2 (不承受无缘无故创建新的临时对象)。与 VC++ 中的 bstr_t 类型不同,ATL 不执行引用计数字符串,因此它将复制整个字符串。
【讨论】:
【参考方案4】:真正的BSTR
是:
SysAllocString()
和家族)
一种数据结构,其中字符串数据前面有其长度,存储在 32 位值中。
作为指向该数据结构的第五个字节的指针传递,字符串数据所在的位置。
查看文档: MSDN: BSTR
大多数接受BSTR
的函数在通过 BSTR 创建简单赋值时不会崩溃。这会导致混淆,因为人们观察似乎正在工作的代码,他们从中推断出BSTR
可以像任何WCHAR *
一样被初始化。这个推论是不正确的。
只有真正的BSTRs
可以传递给 OLE 自动化接口。
通过使用调用SysAllocString()
的CComBSTR()
构造函数,您的代码将创建一个真正的BSTR
。 CComBSTR()
析构函数将负责通过SysFreeString()
将分配的存储返回给系统。
如果您将CComBSTR()
传递给获取所有权的API,请务必调用.Detach()
方法以确保BSTR
未被释放。 BSTRs
是引用计数的(与 COM 对象不同),因此尝试多次释放 BSTR
会崩溃。
【讨论】:
以上是关于ComBSTR 分配的主要内容,如果未能解决你的问题,请参考以下文章