【问题标题】:CComVariant vs. _variant_t, CComBSTR vs. _bstr_tCComVariant 与 _variant_t、CComBSTR 与 _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。同样,我应该更喜欢哪个,为什么?

【问题讨论】:

    标签: c++ com atl


    【解决方案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 确实如此,花一个小时阅读源代码可以让您更好地理解。
      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 2013-05-04
      • 2017-01-11
      • 2023-03-12
      • 2013-08-12
      • 2017-01-02
      • 2016-08-07
      • 2012-04-03
      相关资源
      最近更新 更多