我正在使用ATL(VS2008,所以ATL9 IIRC)来创建COM对象,并且一直在使用CComVariant
类(在atlcomcli.h
中定义)来管理VARIANT
类型。但是,还有另一个名为VARIANT
的{{1}}包装器。 _variant_t
和CComVariant
之间有什么区别吗?我应该使用哪一个?
同样,有两个_variant_t
包装器可用 - BSTR
和CComBSTR
。同样,我应该选择哪个以及为什么?
答案 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类包装的数据类型。
如前所述,课程提供更多方法等。