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

Ste*_*eve 3 delphi com exception-handling

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

Dav*_*nan 9

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

在方法退出之前(在每个COM接口方法中)捕获异常.将结果转换为错误代码.如果你使用a HRESULT然后你可以使用它,safecall并让Delphi编译器在篱笆的另一边重新引发异常.


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

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

  • 实际上,您可以在栅栏的两侧使用safecall.Delphi在safecall函数中放置一个隐式try-except块,并将异常转换为HResults.它还将声明的返回类型转换为"out"参数,并插入隐式HResult返回类型. (3认同)