Search code examples
delphidlloverloadingfpc

Exporting overloaded functions with fpc


I need to create a dll within fpc (delphi-mode). It works fine - but for some reasons, I want to do something (in a unit) like

function doSomeThing(a:type1):type2;stdcall;
function doSomeThing(a:type3):type4;stdcall;

and in the library (for building the dll using the unit above)

exports
    doSomeThing(a:type1) name 'doSomeThingTYPE1',
    doSomeThing(a:type3) name 'doSomeThingTYPE3';

The syntax is self explanatory and is told in How to export Overload functions from DLL? . But it seems to be unavailable in fpc (version 2.6.0-9 [2013/04/14] for x86_64). Is there a chance to do something like that - or do I have to rename the functions within my source?


Solution

  • David consulted me in another thread, I devised something that compiles, but don't know if it works.

    It is based on exporting the function using a defined linker level identifier, and then declaring an external function reimporting it with different Pascal names. Note that bla and bla2 doesn't even have to be in the same unit as dosomething variants.

    library testdll; 
    
    {$mode delphi}
    type 
       type1=integer;
       type3=char;
       type2=smallint;
       type4=widechar;
    
    function doSomeThing(a:type1):type2;stdcall; overload; [public, alias:'bla'];
    begin
      result:=a+1;
    end;
    
    function doSomeThing(a:type3):type4;stdcall; overload; [public, alias:'bla2'];
    begin
      result:=widechar(ord(a)+1000);
    end;
    
    procedure bla; external name 'bla';
    procedure bla2; external name 'bla2';
    exports
        bla name 'doSomeThingTYPE1',
        bla2 name 'doSomeThingTYPE3';
    
    end.