Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does imported Type Library function differ from original source?

I am trying to use a third party library with a COM interface. A C++ sample application is provided, which uses a function declared as:

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

After importing the Type Library, the resulting Delphi code is:

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

In the C++ sample application, the result (HRESULT) is used to determine if the function was executed properly.
Why does Delphi convert this declaration into a procedure so that I cannot get a result back?
What can I do to fix this?

like image 391
Holgerwa Avatar asked Jun 03 '12 13:06

Holgerwa


1 Answers

The safecall calling convention is simply a transformation of an HResult return type. If the function returns non-success (something other than S_OK or S_False, generally), it's wrapped into an exception and thrown (or turned into an reSafeCallError run-time error, if SysUtils hasn't been used anywhere). Check out System._CheckAutoResult for details.

Likewise, if you're implementing a safecall function, any exception is caught and translated into an HResult value (E_Unexpected, unless TObject.SafeCallException is overridden to return something else). See System._HandleAutoException for how that works.

You're welcome to turn the procedure back into a function returning HResult if you want. The calling convention in that case should be stdcall. Using your example:

function DoSomething(const id: WideString; State: Integer): HResult; stdcall;
like image 174
Rob Kennedy Avatar answered Oct 14 '22 02:10

Rob Kennedy