【问题标题】:How to raise Exceptions in a COM Server?如何在 COM 服务器中引发异常?
【发布时间】:2011-04-12 19:10:39
【问题描述】:

如何在 COM 服务器中引发异常以用作 COM 客户端?如果这有什么不同,我的服务器和客户端是用 Delphi 编写的?基本上我有一个后台线程检查我的服务器中的各种东西。当它不高兴时,它应该停止服务器正在做的任何事情,并引发异常。这个异常需要被客户端捕获。不过不知道怎么处理。

【问题讨论】:

    标签: delphi com exception-handling


    【解决方案1】:

    简单的答案是你不知道。异常不是 COM 互操作规范的一部分,因此不应跨越模块边界。您使用状态代码指示错误。

    在方法退出之前(在每个 COM 接口方法中)捕获异常。将结果转换为错误代码。如果您使用HRESULT,那么您可以将其作为safecall 使用,并让Delphi 编译器在围栏的另一边重新引发异常。


    知识渊博的 Rob Kennedy 在评论中指出,safecall 可以用作“栅栏的两边”,这让生活比上面描述的更容易。

    我根本不是这方面的专家(因此需要接受 Rob 的评论)。但是,documentation 表示当您实现safecall 例程时,您应该覆盖TObject.SafeCallException 以将异常转换为HRESULT 错误代码。一些标准的 COM 相关类提供了覆盖的版本,但您可能需要添加一些您自己的逻辑。编译器在通过调用此虚函数处理异常的安全调用例程中写入隐式 Try/Except 块。

    【讨论】:

    • 其实可以在栅栏的两边使用safecall。 Delphi 在 safecall 函数中放置了一个隐式 try-except 块,并将异常转换为 HResults。它还将声明的返回类型转换为“out”参数并插入隐式 HResult 返回类型。
    • @rob 太好了,我从来不知道。它如何将异常转换为 HRESULT?
    • 一些解释here.
    • 在安全调用函数中,编译器将主体包装在一个 try-except 块中。如果发生异常,则控制转到 System.pas 中的 _HandleAutoException 函数。如果 safecall 函数不是方法,则返回的 HResult 始终为 E_Unexpected。否则,它是一个安全调用方法,因此它调用 SafeCallException 以允许对象执行更好的异常到 HResult 的转换;默认的 TObject 实现只返回 E_Unexpected。
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2010-10-21
    • 2020-07-20
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多