CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

Posted

技术标签:

【中文标题】CComVariant 与 _variant_t、CComBSTR 与 _bstr_t【英文标题】:CComVariant vs. _variant_t, CComBSTR vs. _bstr_t 【发布时间】:2011-01-18 07:57:41 【问题描述】:

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

同样,有两个 BSTR 包装器可用 - CComBSTR_bstr_t。同样,我应该更喜欢哪个,为什么?

【问题讨论】:

【参考方案1】:

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

CComVariant 和 CComBSTR 由 ATL libraries 提供。

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

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

【讨论】:

请注意,_variant_t 和 _bstr_t 在 SDK 中是免费提供的。 ATL 随 MSDN 提供,并且是付费的。 +1 获取附件信息。您可以封装现有的BSTR bstr,例如_bstr_t my_bstr(bstr, false)CComBSTR my_bstr; my_bstr.Attach(bstr);,因此如果您只需要自动销毁BSTR,_bstr_t 更简单。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

+1 我想说这是关键的区别。使用 ATL,您必须编写大量额外的错误检查代码。另一方面,如果您不想为异常烦恼,您应该更喜欢 ATL 类。【参考方案4】:

我会根据手头的任务使用这两种方法。 如前所述,_variant_t 和 _bstr_t 更基础,而 ATL 类更高级(与 MFC 更好对应)。 我的建议是看一下类的定义。它们都只是更小、更易读的代码的帮手,但在内存和对象引用的管理方面仍然存在某些缺陷。因此,您必须对它们的内部结构有所了解,而文档通常对此不是很清楚。

【讨论】:

+1 确实如此,花一个小时阅读源代码可以让您更好地理解。

以上是关于CComVariant 与 _variant_t、CComBSTR 与 _bstr_t的主要内容,如果未能解决你的问题,请参考以下文章

_variant_t的使用

C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'

关于CString与VARIANT(CComVariant)之间的转化

如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?

_variant_t 范围指针的 C++ 文字自动化问题(AddPicture() 方法)

_bstr_t和_variant_t是怎样定义的