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

时间:2012-06-03 13:28:13

标签: delphi delphi-xe2

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

safecall调用约定只是HResult返回类型的转换。如果函数返回不成功(通常不是S_OKS_False),它将被包装到异常中并抛出(或变为reSafeCallError运行时错误,如果SysUtils没有在任何地方使用过)。查看System._CheckAutoResult了解详情。

同样,如果您正在实现safecall函数,则会捕获任何异常并将其转换为HResult值(E_Unexpected,除非重写TObject.SafeCallException以返回其他内容)。有关其工作原理,请参阅System._HandleAutoException

如果您愿意,欢迎将程序恢复为返回HResult的函数。在这种情况下,调用约定应为stdcall。使用您的示例:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall;