【问题标题】:Exceptions in COMCOM 中的异常
【发布时间】:2011-04-24 16:14:42
【问题描述】:

我正在用 COM 代码编写一个接口,我知道这个接口的唯一用户是我自己的代码(间接地)。如果我抛出异常,我可以在中间的库的另一边捕获它吗?这是一个终止条件,因此世界上最优雅的清理并不是有史以来最大的交易。

【问题讨论】:

  • 如果你能做出这样的保证,那么使用 COM 就没有意义了。
  • @Hans Passant:中间库需要 COM。我个人不需要 COM。
  • 好吧,它当然不会期望异常。
  • 别这样。你能确定你的调用者和被调用者之间不会有编组器吗?如果您需要详细的错误信息,请使用 IErrorInfo 或您的类型/接口的 out 参数。

标签: c++ exception com


【解决方案1】:

不允许异常跨越 COM 接口边界。因为 C++ 异常没有二进制契约,所以 COM 不能将它们从一个线程封送到另一个线程。现在这可能不是一个大问题,但如果您决定更改 COM 对象的线程模型,以后可能会成为一个问题。

另外,如果您决定要用 C#(或 Delphi 或其他)重写应用程序的前端,会发生什么?各种 COM 互操作框架都可以理解 COM HRESULTS,但 C++ 异常却不是(没有 C++ 异常的二进制协定)。

【讨论】:

  • +1 还补充说,跨 COM 边界提供错误信息的“正确”方法是实现 IErrorInfo msdn.microsoft.com/en-us/library/ms221233.aspx。大多数客户端组件,包括 C++ COM 支持类,如 _com_ptr_t,将利用此信息并引发带有详细信息的异常。
  • 我想指出,通常也很难追踪此类错误。我见过的场景从进程刚刚陷入困境,到晦涩难懂的 E_xxx 返回码,表明编组过程中出现错误。在 COM 竞技场上不遵守 COM 规则是在要求一个痛苦的世界......
  • +1。特别是如果 C++ 异常到达 C# 代码,则 C# 代码会大量崩溃。
猜你喜欢
  • 2011-08-08
  • 2012-02-28
  • 2014-04-23
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多