Az összeadás hibás értéke egyértelműen verem (stack) probléma. A függvénytárak hívásakor az stdcall, cdecl vagy más módosító megadásakor a paraméterek másképpen lesznek kezelve (sorrendjük a veremben is eltérhet), ezért ezt egyértelműsíteni kell a függvénytárban is, hogy ne legyen zavar. Valahogy így:
library mylib;
{$mode objfpc}{$H+}
uses
Classes, Windows, Dialogs;
function MyAdd( x: integer; y: integer ): integer; stdcall; export;
begin
Result:=x+y;
end;
procedure MyMsg(); stdcall; export;
begin
MessageBox( 0, PChar('MyMsg procedure run from DLL!'),PChar(''), MB_OK );
end;
exports MyAdd,
MyMsg;
begin
end.
Az alkalmazásodat így már megfelelő értéket ír ki a MyAdd ereményeként:
procedure TForm1.Button1Click(Sender: TObject);
type
TMyFun=function (a:Integer; b: integer):integer; stdcall;
TMyMsg=procedure ; stdcall;
var
MyLib: TLibHandle = dynlibs.NilHandle;
MyFun: TMyFun;
MyMsg: TMyMsg;
FuncResult: integer;
begin
FuncResult:=0;
MyLib := SafeLoadLibrary('mylib.dll');
if MyLib = dynlibs.NilHandle then begin
Exit;
end;
MyFun:= TMyFun(GetProcedureAddress(MyLib, 'MyAdd'));
MyMsg:= TMyMsg(GetProcedureAddress(MyLib, 'MyMsg'));
FuncResult:= MyFun (5, 2);
MyMsg;
// if MyLib <> DynLibs.NilHandle then
// if FreeLibrary(MyLib) then
// MyLib:= DynLibs.NilHandle;
ShowMessage( 'Result from Dll: ' + IntToStr( FuncResult ) );
end;
A függvénytár "felszabadítását" megjegyzésbe tettem, mert nálam (Wine) kiakad miatta a program (ezen még töprengek). A függvénytár mindenképpen felszabadításra kerül ha a programod leáll.