Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Adresse einer funktion im hauptmodul herausfinden (https://www.delphipraxis.net/49388-adresse-einer-funktion-im-hauptmodul-herausfinden.html)

DGL-luke 10. Jul 2005 19:00


Adresse einer funktion im hauptmodul herausfinden
 
Ich will eine Funktionsadresse an eine DLL übergeben.

Delphi-Quellcode:
FetchFunc(@MyFunc);
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?

brechi 10. Jul 2005 19:05

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;

DGL-luke 10. Jul 2005 19:14

Re: Adresse einer funktion im hauptmodul herausfinden
 
hier nochmal die relevanten stellen aus dem hauptprogramm:

Delphi-Quellcode:
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;
die dll kompiliert anstandslos, aber das haptprog nicht.

brechi 10. Jul 2005 19:20

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

brechi 10. Jul 2005 19:23

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;

DGL-luke 10. Jul 2005 19:34

Re: Adresse einer funktion im hauptmodul herausfinden
 
und welche möglichkeit ist jetzt mehr OOP? :mrgreen:

ich glaub, ich nehm das erste....

SirThornberry 10. Jul 2005 20:19

Re: Adresse einer funktion im hauptmodul herausfinden
 
es kann auch eine Methode verwendet werden, dann bekommst du die Adresse aber nicht über
Delphi-Quellcode:
@instanz.functionname
sodern über
Delphi-Quellcode:
@TYourClass.Functionname
dabei muss dann natürlich auch der unsichtbare Self-Parameter der Funktion beachtet werden

DGL-luke 10. Jul 2005 20:31

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:
//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.
ist jetzt auf dem stand von 21:46.

brechi 10. Jul 2005 20:35

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

DGL-luke 10. Jul 2005 21:14

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.
Seite 1 von 2  1 2      

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