Why does imported Type Library function differ from original source?

delphi, delphi-xe2

Solution

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;

Problem

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?

Original source

Related problems