如何在COM服务器中引发异常?

时间:2011-04-12 19:10:40

标签: delphi com exception-handling

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

1 个答案:

答案 0 :(得分:9)

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

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


总是知识渊博的Rob Kennedy在评论中指出safecall可以用于“围栏的两侧”,这使得生活比上面概述的更容易。

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