我正在尝试使用带有COM接口的第三方库。 提供了一个C ++示例应用程序,它使用声明为:
的函数HRESULT __stdcall IMyInterface::DoSomething (BSTR id, long State)
导入类型库后,生成的Delphi代码为:
procedure DoSomething (const id: WideString; State: Integer); safecall;
在C ++示例应用程序中,结果(HRESULT)用于确定函数是否正确执行 为什么Delphi会将此声明转换为一个程序,以便我无法得到结果? 我该怎么做才能解决这个问题?
答案 0 :(得分: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;