[fpc-pascal] How to call lib routines with cdecl calling convention with win32 app?
Jonas Maebe
jonas.maebe at elis.ugent.be
Sun May 31 18:14:09 CEST 2009
On 31 May 2009, at 15:28, Coco Pascal wrote:
> Marco van de Voort schreef:
>> In our previous episode, Coco Pascal said:
>>
>>> I have a library with udf routines using the cdecl calling
>>> convention, required by Firebird. This seems to work well on win32.
>>
>> How exactly?
>>
>
> ?
>
> function Y_Odd(const AValue: Int64): LongInt; cdecl; export;
> begin
> if Odd(AValue) then
> Result := -1
> else
> Result := 0;
> end; {Y_Odd}
>
> exports
>
> Y_Odd;
>
> This works fine with Firebird. If I declare the stdcall calling
> convention Firebird can't find its entrypoint.
cdecl automatically enables C-compiler-compatible name mangling for
exported procedures. stdcall doesn't. So it's normal that Firebird
does not find the entrypoint when using stdcall, as it does not
support FPC-style name mangling.
There is no way to get C name mangling without the calling convention,
so you have to manually declare an alias in that case. E.g.,
> function Y_Odd(const AValue: Int64): LongInt; cdecl; alias:
> '_Y_Odd'; export;
Whether or not you need an extra underscore before the alias name
depends on the target platform. Win32 requires one.
Jonas
More information about the fpc-pascal
mailing list