CComVariant与_variant_t,CComBSTR与_bstr_t的区别

20
我正在使用ATL(VS2008,所以应该是ATL9)创建COM对象,并一直使用CComVariant类(定义在atlcomcli.h中)来管理VARIANT类型。然而,还有另一个VARIANT包装器名为_variant_tCComVariant_variant_t之间有什么区别,我应该使用哪个呢?
同样地,有两个可用的BSTR包装器——CComBSTR_bstr_t。再次提问,我应该选择哪一个,为什么?
4个回答

17

_variant_t和_bstr_t由编译器提供作为COM支持类,在使用类似于#import的结构时会被使用。如果您喜欢,可以使用它们。

CComVariant和CComBSTR由ATL库提供。

无论您使用COM支持类还是ATL类都可以。如果您经常需要执行像附加到“原始”BSTR或VARIANT之类的操作,则COM支持类可能更安全。

有一些行为差异(请查看文档),其中最重要的似乎是当出现错误时,COM支持类将抛出_com_error&异常。如果您不想进行异常处理,请选择ATL类。


请注意,SDK中免费提供_variant_t和_bstr_t。ATL随附于MSDN,需要付费获取。 - Ben
附加信息加1。您可以使用 _bstr_t my_bstr(bstr, false)CComBSTR my_bstr; my_bstr.Attach(bstr); 封装现有的 BSTR bstr,因此如果您只需要自动 BSTR 销毁,则 _bstr_t 更简单。 - Felix Dombek

7

一个主要的区别是 ATL 的类不会抛出异常,而编译器支持的类会抛出异常(具体来说是 _com_exception)。

_bstr_t 是引用计数的,而 CComBSTR 更像是一个原始包装器。


2
+1 我认为这是关键的区别。使用ATL,您必须编写大量额外的错误检查代码。另一方面,如果您不想麻烦异常处理,您应该选择ATL类。 - sharptooth

1

我根据手头的任务使用两者。如前所述,_variant_t 和 _bstr_t 更基础,而 ATL 类更高级(MFC 的更好对应)。我的建议是稍微查看一下这些类的定义。它们都只是帮助编写更小、更易读的代码,但仍然包含某些关于内存和对象引用管理的陷阱。因此,您必须了解一些它们的内部情况,而文档通常并不清楚。


+1 当你花一个小时阅读源代码时,你会获得更好的理解。 - sharptooth

0

BSTR和VARIANT是被CComBSTR/_bstr_t和CComVariant/_variant_t类封装的数据类型。
正如前面所述,这些类提供了更多的方法等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接