Delphi 如何获取CDO.Message的错误代码

Delphi 如何获取CDO.Message的错误代码,delphi,error-handling,certificate,transport,cdo.message,Delphi,Error Handling,Certificate,Transport,Cdo.message,我编写了使用CDO.Message的例程。它很久以前就开始工作了。 但是现在,在一些站点上,他们安装了一个证书,然后原来的工作版本在所有调用中都出现了错误 我使用简单的变体来保存CDO.Message.COM对象 当我使用Send方法(?)时,它返回一个HResult。 但这很有趣,因为HResult对于获取错误代码是不可用的,因为Send似乎是一个真正的方法,它在出现问题时会出现异常。 所以如果我之前设置了这个值,结果代码是-1 我试图用GetLastError获取最后一个错误代码。但这是0

我编写了使用CDO.Message的例程。它很久以前就开始工作了。 但是现在,在一些站点上,他们安装了一个证书,然后原来的工作版本在所有调用中都出现了错误

我使用简单的变体来保存CDO.Message.COM对象

当我使用Send方法(?)时,它返回一个HResult。 但这很有趣,因为HResult对于获取错误代码是不可用的,因为Send似乎是一个真正的方法,它在出现问题时会出现异常。 所以如果我之前设置了这个值,结果代码是-1

我试图用GetLastError获取最后一个错误代码。但这是0

我可以捕获异常,但它只包含以下错误消息:

“传输无法连接到服务器”

VB代码可以获取错误代码,该错误代码可以提供有关问题的额外信息(或不提供)


您知道从Delphi XE3获取错误代码值的技术吗?

如果我们手头有一些源代码就更好了。特别是COM接口的Delphi声明

我猜想该方法被声明为
safecall
。这意味着编译器知道该方法实际上是
stdcall
返回
HRESULT
,并重新写入要匹配的参数。如果true COM方法返回一个
HRESULT
而不是
S_OK
,那么编译器将编写代码来检查该错误,并将错误转换为异常

引发的异常将是
EOleSysError
,该异常具有属性
ErrorCode
,其中包含您正在查找的
HRESULT

因此,您需要:

  • 添加异常处理程序以捕获
    EOleSysError
  • 读取捕获的
    EOleSysError
    异常实例的
    ErrorCode
    属性
这些都在房子周围。如果希望避免异常处理,则始终可以将COM接口声明重写为返回
HRESULT
的true
stdcall
方法