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_t
。 CComVariant
和 _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的主要内容,如果未能解决你的问题,请参考以下文章
C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'
关于CString与VARIANT(CComVariant)之间的转化
如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?