为什么导入的类型库功能与原始源不同?

Hol*_*rwa 6 delphi delphi-xe2

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

HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State)
Run Code Online (Sandbox Code Playgroud)

导入类型库后,生成的Delphi代码为:

procedure DoSomething (const id: WideString; State: Integer); safecall;
Run Code Online (Sandbox Code Playgroud)

在C++示例应用程序中,结果(HRESULT)用于确定函数是否正确执行.
为什么Delphi会将此声明转换为程序,以至于我无法获得结果?
我该怎么做才能解决这个问题?

Rob*_*edy 7

safecall调用约定仅仅是一个的转型HResult返回类型.如果函数返回非成功(通常不是S_OK或者某些东西S_False),它将被包装到异常中并抛出(或者reSafeCallError如果SysUtils没有在任何地方使用过,则会变成运行时错误).查看System._CheckAutoResult详细信息.

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

如果您愿意,欢迎将程序恢复为函数返回HResult.那种情况下的召集惯例应该是stdcall.使用你的例子:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall;
Run Code Online (Sandbox Code Playgroud)