//hauptprogramm - habe den kopf mal weggelassen.
type TIntfunc =
function(iParam:integer):integer;
stdcall;
TPFunc =
function(adress:Pointer):boolean;
stdcall;
var
Form1: TForm1;
param:integer;
fetchfunc:TPfunc;
mainfunc:TIntFunc;
modhandle:THandle;
implementation
{$R *.dfm}
function TForm1.dosomething(iParam:integer):integer;
begin
application.MessageBox(PChar('
Die dll meldet: '+inttostr(iParam)),'
Erfolg');
result:=iParam;
end;
procedure TForm1.FormCreate(Sender: TObject);
var srec:TSearchrec;
begin
listbox1.Clear;
findfirst(extractfilepath(paramstr(0))+'
*.dll',faAnyFile,srec);
listbox1.Items.add(srec.
Name);
while findnext(srec)=0
do listbox1.items.Add(srec.
Name);
findclose(srec);
end;
procedure TForm1.ListBox1DblClick(Sender: TObject);
var s:
string;
i:integer;
begin
s:='
';
for i := 0
to listbox1.Count -1
do
begin
if listbox1.Selected[i]
then s:=listbox1.Items[i];
end;
if s<>'
'
then
begin
modhandle:=LoadLibrary(PChar(extractFilePath(paramstr(0)+s)));
application.MessageBox('
DLL geladen','
Erfolg');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var p:pointer;
begin
@fetchfunc:=getProcAddress(modhandle,'
FetchFunc');
//fetchfunc krallt sich die adresse der übergebenen funktion
@mainfunc:=getProcAddress(modhandle,'
Main');
//mainfunc ruft die übergebene funktion auf
application.MessageBox('
funktionen geladen','
');
asm
mov eax, offset dosomething
mov p, eax
end;
fetchfunc(p);
// hier der fehler
sleep(10);
application.MessageBox('
funktion übergeben','
');
mainfunc(strtoint(edit1.Text));
//wie bereits gesagt: mainfunc ruft....
end;
end.