AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Adresse einer funktion im hauptmodul herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Adresse einer funktion im hauptmodul herausfinden

Ein Thema von DGL-luke · begonnen am 10. Jul 2005 · letzter Beitrag vom 10. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:00
Ich will eine Funktionsadresse an eine DLL übergeben.

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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#2

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:05
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;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:14
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:20
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:23
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;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 18:34
und welche möglichkeit ist jetzt mehr OOP?

ich glaub, ich nehm das erste....
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 19:19
es kann auch eine Methode verwendet werden, dann bekommst du die Adresse aber nicht über
@instanz.functionname sodern über
@TYourClass.Functionname dabei muss dann natürlich auch der unsichtbare Self-Parameter der Funktion beachtet werden
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 19:31
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 19:35
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
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Adresse einer funktion im hauptmodul herausfinden

  Alt 10. Jul 2005, 20:14
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz