6

我正在尝试使用带有 COM 接口的第三方库。提供了一个 C++ 示例应用程序,它使用声明为的函数:

HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State)

导入类型库后,得到的 Delphi 代码为:

procedure DoSomething (const id: WideString; State: Integer); safecall;

在 C++ 示例应用程序中,结果 (HRESULT) 用于确定函数是否正确执行。
为什么 Delphi 将这个声明转换为一个过程,这样我就无法得到结果?
我能做些什么来解决这个问题?

4

1 回答 1

7

safecall调用约定只是HResult返回类型的转换。如果函数返回不成功(通常不是S_OKor S_False),则将其包装到异常中并抛出(reSafeCallError如果未在任何地方使用 SysUtils,则将其转换为运行时错误)。查看System._CheckAutoResult详情。

同样,如果您正在实现一个安全调用函数,任何异常都会被捕获并转换为一个HResult值(E_Unexpected除非TObject.SafeCallException被覆盖以返回其他内容)。看看System._HandleAutoException它是如何工作的。

如果需要,欢迎您将过程转回返回的函数HResult。这种情况下的调用约定应该是stdcall. 使用您的示例:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall;
于 2012-06-03T16:01:09.340 回答