Имеется проверочный модуль 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.