![]() |
Adresse einer funktion im hauptmodul herausfinden
Ich will eine Funktionsadresse an eine DLL übergeben.
Delphi-Quellcode:
Verständlicherweise meint Delphi aber, ich will die Funktion(myfunc) ausführen, und sagt "Variable benötigt" bzw. "nicht genügend wirkliche Parameter". getProcaddress kann auch nicht funktionieren, da myfunc dafür ja in den exports stehen müsste, myfunc liegt aber im hauptprogramm und nicht in einer DLL. wie finde ich die adresse also raus?
FetchFunc(@MyFunc);
|
Re: Adresse einer funktion im hauptmodul herausfinden
das ist schon so richtig
Delphi-Quellcode:
// dll
var p: procedure; procedure GibFunktionAn(a: pointer); stdcall; begin @p := a; end; procedure hallo; begin p; //die funktion bla aus dem hauptprogramm aufrufen end; exports GibFunktionAn;
Delphi-Quellcode:
//programm
procedure bla; begin // tu was end; procedure main; var p: procedure(a: pointer); stdcall; begin @p := GetProcAddres(LoadLibrary('deinedll.dll'),'GibFunktionAn'); p(@bla); //dll funktion aufrufen und als parameter die bla funktion angeben end; |
Re: Adresse einer funktion im hauptmodul herausfinden
hier nochmal die relevanten stellen aus dem hauptprogramm:
Delphi-Quellcode:
die dll kompiliert anstandslos, aber das haptprog nicht.
type PInt = ^integer;
TIntfunc=function(iParam:integer):integer; TPFunc =function(pParam:PInt):boolean; var Form1: TForm1; param:integer; fetchfunc:TPfunc; mainfunc:TIntFunc; modhandle:THandle; function TForm1.dosomething(iParam:integer):integer; begin application.MessageBox(PChar('Die dll meldet: '+inttostr(iParam)),'Erfolg'); result:=0; end; procedure TForm1.Button1Click(Sender: TObject); begin @fetchfunc:=getProcAddress(modhandle,'FetchFunc'); //fetchfunc krallt sich die adresse der übergebenen funktion @mainfunc:=getProcAddress(modhandle,'Main'); //mainfunc ruft die übergebene funktion auf fetchfunc(@self.dosomething); // hier der fehler: E2036 Variable erforderlich mainfunc(strtoint(edit1.Text)); //wie bereits gesagt: mainfunc ruft.... end; |
Re: Adresse einer funktion im hauptmodul herausfinden
die funktion DOSomething darf zu keiner Klasse gehören
d.h. mach das TForm1. davor weg und lösch sie ausm private/public teil dann gehts |
Re: Adresse einer funktion im hauptmodul herausfinden
oder du hacks nen bisl :) :
Delphi-Quellcode:
public
{ Public-Deklarationen } procedure Bla; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.bla; begin end; procedure TForm1.FormCreate(Sender: TObject); var p: pointer; begin asm mov eax, offset bla mov p, eax end; // in p haste dann die adresse end; |
Re: Adresse einer funktion im hauptmodul herausfinden
und welche möglichkeit ist jetzt mehr OOP? :mrgreen:
ich glaub, ich nehm das erste.... |
Re: Adresse einer funktion im hauptmodul herausfinden
es kann auch eine Methode verwendet werden, dann bekommst du die Adresse aber nicht über
Delphi-Quellcode:
sodern über
@instanz.functionname
Delphi-Quellcode:
dabei muss dann natürlich auch der unsichtbare Self-Parameter der Funktion beachtet werden
@TYourClass.Functionname
|
Re: Adresse einer funktion im hauptmodul herausfinden
ah ja.
aber jetz krieg ich ne 0-AV. ich poste mal alles:
Delphi-Quellcode:
library DChild;
uses SysUtils, Classes; type TIntFunc=function(iParam:integer):integer; var myfunc:TIntFunc; assgnd:boolean; {$R *.res} function FetchFunc(address:Pointer):boolean; stdcall; begin @myfunc:=address; assgnd:=true; result:=true; end; function Main(param:integer):integer; stdcall; begin myfunc(param); result:=0; end; exports FetchFunc,Main; begin end.
Delphi-Quellcode:
ist jetzt auf dem stand von 21:46.
//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. |
Re: Adresse einer funktion im hauptmodul herausfinden
sicher das du den fehler da bekommen hast?
dann hat der wohl FetchFunc nicht importieren können denn der aufruf sollte eigetlich egal sein selbst wenn der pointer auf nil zeigen würde drüfte es erst ab dem main crashen EDIT: sicher das modhandle <> 0 ist? solltest bei der msg, "dll geladen" vorher auf <> 0 prüfen |
Re: Adresse einer funktion im hauptmodul herausfinden
Ja da schau her... tatsächlich..... ich habe eine klammer falsch gesetzt, und deshalb wurde der name der dll als verzeichnis interpretiert....
aber jetzt krieg ich write-exceptions. und zwar fortgesetzt. werde weiter debuggen, wenn sich das BDS wieder gefangen hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz