Einzelnen Beitrag anzeigen

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