【问题标题】:Pass parameters as BSTR or _bstr_t?将参数作为 BSTR 或 _bstr_t 传递?
【发布时间】:2015-11-13 12:53:51
【问题描述】:

我的 COM 实现类将参数作为 BSTR(和 VARIANT*)并在内部传递。通常我们将它们转换为std::stringstd::wstring,但有时它们会被绕过并被发送回另一个 COM 调用。

在这些情况下,是传递原始 COM 类型更好,还是将它们包装在帮助程序类中,如 _bstr_t_variant_t

【问题讨论】:

  • _bstr_t 和 _variant_t 用于管理分配给 BSTR 和 VARIANT 的资源。通常,通过将 BSTR(可能引用系统资源)包装在自动变量 _bstr_t 中,您可以通过避免释放资源的需要来使代码更清晰,因为 _bstr_t 析构函数会在超出范围时为您执行此操作。所以问题不在于它是否被传递给另一个 COM 调用,而在于你是否对资源负责。
  • 详细说明,您收到的任何纯in 参数的BSTR 纯粹是调用者的责任。您可以将它们包装在 _bstr_t 中(这将创建它们的副本),但这感觉没有必要。不过,我想,变体是一个更复杂的问题。

标签: c++ com


【解决方案1】:

如果你对 BSTR 没有做任何特别的事情,只是将它传递给另一个方法,那么你不必包装它。您可以将 BSTR 视为一个不透明的指针。

_bstr_t(或 CComBSTR,它是 Visual Studio 的另一个包装器提供程序)在您需要分配 BSTR 并且不想自己管理内存(并确保您没有泄漏内存)时很有用,但它们不是强制性的.

PS:除非我需要输出 BSTR 到不理解 Unicode 的程序,否则我将永远使用中介 std:string 来传递 BSTR,因为我会冒丢失信息的风险。 std:wstring 更好。

【讨论】:

  • 回复。最后一条评论,std::string 如果它存储 UTF-8,则可以使用它。这是在 C++ 中处理 unicode 的一种流行方式。
  • @M.M - 你是对的(尽管我认为这是一个坏主意,尤其是在 Windows 平台上)
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 2011-05-19
  • 2013-08-12
  • 2010-09-25
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多