CComVariant与_variant_t,CComBSTR与_bstr_t

时间:2010-02-18 13:19:14

标签: c++ com atl

我正在使用ATL(VS2008,所以ATL9 IIRC)来创建COM对象,并且一直在使用CComVariant类(在atlcomcli.h中定义)来管理VARIANT类型。但是,还有另一个名为VARIANT的{​​{1}}包装器。 _variant_tCComVariant之间有什么区别吗?我应该使用哪一个?

同样,有两个_variant_t包装器可用 - BSTRCComBSTR。同样,我应该选择哪个以及为什么?

4 个答案:

答案 0 :(得分:16)

_variant_t和_bstr_t由编译器提供为COM support classes,并在使用#import等构造时使用。如果您愿意,可以使用它们。

CComVariant和CComBSTR由ATL libraries提供。

您是否使用COM支持类或ATL类取决于您。如果您经常需要执行附加到“原始”BSTR或VARIANT等操作,则COM支持类可能是更安全的选择。

存在一些行为差异(检查文档),其中最重要的似乎是COM支持类将抛出_com_error&什么东西都失败了。如果您不想进行异常处理,请使用ATL类。

答案 1 :(得分:7)

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

_bstr_t是引用计数的,而CComBSTR更多是原始包装。

答案 2 :(得分:1)

我根据手头的任务使用两者。 如前所述_variant_t和_bstr_t更基本,而ATL类更高级别(MFC的更好的对应物)。 我的建议是看一下类的定义。所有这些只是更小,更易读的代码的帮助者,但仍然包含有关内存和对象引用管理的某些缺陷。所以你必须对他们的内部知识有所了解,文档通常不是很清楚。

答案 3 :(得分:0)

BSTR和VARIANT是由CComBSTR / _bstr_t和CComVariant / _variant_t类包装的数据类型。
如前所述,课程提供更多方法等。