Имеется проверочный модуль TestExport, в котором экспортируются процедуры Foo, Foo2 и переменные.
Код:
PROCEDURE Foo* (IN path: Files.Name; name: Files.Name; OUT error: BOOLEAN);
PROCEDURE Foo2* (OUT error: BOOLEAN);
Определив в интерфейсной части описания этих процедур в Free Pascal
Код:
    TFooProc = procedure (path, name: Pchar; var error: boolean); stdcall;
    TFoo2Proc = procedure (var error: boolean); stdcall;
я получаю исключение при попытке выполнить процедуру Foo, однако, Foo2 выполняется гладко. DLL загружается динамически.
В Foo пробовал вместо Pchar выставить WideString, Array Of Char - не помогло.
Как правильно объявить Foo?
Код:
MODULE TestExport;
IMPORT Files;
TYPE
   TA* = RECORD
      d-,
      d2-: REAL;
   END;
   
VAR
   Int-: INTEGER;
   A-: TA;
PROCEDURE Foo* (IN path: Files.Name; name: Files.Name; OUT error: BOOLEAN);
BEGIN
   (*error := (name = "")*)
   error := TRUE
END Foo;
PROCEDURE Foo2* (OUT error: BOOLEAN);
BEGIN
   error := TRUE
END Foo2;
BEGIN
   A.d := 321.345;
   A.d2 := A.d*2.0;
   Int := 3*1024
END TestExport.
^Q 
DevLinker.LinkDll export.dll := Kernel+ Files TestExport# ~Код:
Unit uexport;
Interface
Const
{$ifdef win32}
    Lib = 'export.dll';
  {$IFDEF FPC}
    {$smartlink on}
  {$ENDIF}
{$else}
    Lib = 'export.so';
{$endif}
type
    TA = record
        d,
        d2: double
    end;
    TFooProc = procedure (path, name: Pchar; var error: boolean); stdcall;
    TFoo2Proc = procedure (var error: boolean); stdcall;
Implementation
begin
end.
Код:
{$IFDEF FPC}
    {$mode delphi}
{$ENDIF}
program testexp;
uses
    HostModuleLoader, uexport;
var
    M: TDynLoadModule;
    pInt: pInteger;
    pA: ^TA;
    FooProc: TFooProc;
    Foo2Proc: TFoo2Proc;
    er: boolean;
begin
    M := TDynLoadModule.Create();
    if M.LoadModule (Lib) then
    begin
        writeln ('Loaded');
        pInt := M.GetModuleSymbol('Int');
        pA := M.GetModuleSymbol('A');
        @FooProc := M.GetModuleSymbol('Foo');
        @Foo2Proc := M.GetModuleSymbol('Foo2');
        if Assigned (pInt) then writeln (pInt^);
        if Assigned (pA) then begin
            writeln (pA^.d:8:2);
            writeln (pA^.d2:8:2);
        end;
        if Assigned (Foo2Proc) then begin
            writeln('Foo2 test');
            Foo2Proc (er);
            writeln (er);
        end;
        if Assigned (FooProc) then begin
            writeln('Foo test');
            FooProc ('', '', er);
            writeln (er);
        end;
        
        M.UnloadModule;
    end
    else writeln ('failed to load.');
    M.Free;
end.