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 Kommunikation zwischen (injected) DLL und Programm (https://www.delphipraxis.net/68009-kommunikation-zwischen-injected-dll-und-programm.html)

DarkPressure 23. Apr 2006 10:30


Kommunikation zwischen (injected) DLL und Programm
 
Hallo erstmal ^^
Also folgende Situation:
Ich habe eine DLL in einen Prozess geladen, diese soll aber jetzt meinem Hauptprogramm "Bericht erstatten".
Das ganze über Registry zu realisieren ist zu umständlich, gibt es keine andere Methode?
Achja nach Möglichkeit müsst ich auch der DLL Anweisungen geben können.

Gruß DarkPressure

Bernhard Geyer 23. Apr 2006 10:37

Re: Kommunikation zwischen (injected) DLL und Programm
 
Möglichkeiten wären über Sockets (evtl. Stören aber Firewalls) oder Windows-Messages.

DarkPressure 23. Apr 2006 10:45

Re: Kommunikation zwischen (injected) DLL und Programm
 
Zitat:

Zitat von Bernhard Geyer
Windows-Messages

Erstmal danke für die schnller Antwort, da ich mir eingestehen muss ein totaler Delphi noob zu sein, würd ich gern wissen was es mit diesen Windows-Messages auf sich hat und wie man die einsetzt.

Bernhard Geyer 23. Apr 2006 10:53

Re: Kommunikation zwischen (injected) DLL und Programm
 
Schau dir mal die Threads zu Hier im Forum suchenWM_COPYDATA an.

DarkPressure 23. Apr 2006 11:23

Re: Kommunikation zwischen (injected) DLL und Programm
 
So weit, so gut :wink:
Trotzdem gibts ein weiteres Problem, in meiner DLL sagt er mir Handle ist ein undeclared identifier, obwohl ich Controls als Unit hinzugefügt hab.
Delphi-Quellcode:
  ...
  hTargetWnd := FindWindowEx(0, 0, nil, PChar('Fenster'));
  if hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
  else
    ShowMessage('No Recipient found!')
  ...
EDIT: Mittlerweile weiß ich, dass dieses Hanlde sich nur auf die Controls eienr Form bezieht..
Aber wie löst man das in der DLL?

Meflin 23. Apr 2006 11:38

Re: Kommunikation zwischen (injected) DLL und Programm
 
Hier im Forum suchenNamed Pipes wären auch eine Möglichkeit - da gibts auch Komponenten dazu ;)


DarkPressure 23. Apr 2006 14:10

Re: Kommunikation zwischen (injected) DLL und Programm
 
Ich krieg die Krise mit den Pipes :wall:
Im Client steht jetzt
Delphi-Quellcode:
procedure TForm1.NPipeServer1IncomingData(Sender: TObject; Data: TMemoryStream;
  var Reply: TMemoryStream);
begin
  Memo1.Lines.LoadfromStream(Data);
end;
Und wirds in der DLL initialisiert: (Beispiel)
Delphi-Quellcode:
   begin
   PipeClient := TNPipeClient.Create(Nil);
   PipeClient.PipeName := 'MyPipe';
   PipeClient.SendTimeout := 500;
   WMSend('Recv', 999);
   end;
Delphi-Quellcode:
procedure WMSend(Action: string; Socket: Integer); stdcall;
var
  MS : TMemoryStream;
  Senddata: string;
begin
  MS:=TMemoryStream.Create;
  Senddata := Action + IntToSTR(Socket);
  MS.WriteBuffer(Pointer(Senddata)^, Length(Senddata));
  PipeClient.SendBuffer(MS);
  MS.Free;
end;
Ich bin wirklich am verzweifeln :gruebel:

DarkPressure 23. Apr 2006 20:09

Re: Kommunikation zwischen (injected) DLL und Programm
 
Sory für doppel Antwort, abe rich möchte sagen, dass ich auf Pipe lieber verzichte.
Ich würde gern die Windows Message Methode nutzen,
Delphi-Quellcode:
...
  hTargetWnd := FindWindowEx(0, 0, nil, PChar('Fenster'));
  if hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
  else
    ShowMessage('No Recipient found!')
  ...
Kann mir da jemand sagen wie ich da smit dem Handl löse in einer DLL
Hoffe jemand kann mir weiter helfen :balloon:

guste 23. Apr 2006 20:31

Re: Kommunikation zwischen (injected) DLL und Programm
 
Hallo,

also Dein Hauptprogramm könnte eine Broadcast Message senden, auf die Deine Dll mit dem Handle der eigenen Fensterprozedur antwortet.
Von diesem Zeitpunkt kennt das Hauptprogramm und die Dll die entsprechenden Handles.

Für Broadcast Message:

DBT_INIT: cardinal;
DBT_INIT := RegisterWindowMessage(MSG_DBT_INIT);
PostMessage(HWND_BROADCAST,DBT_INIT,self.handle,0) ;

Für Fensterprozedur Dll

procedure WndProc(var Message: TMessage);
begin
if Message.Msg = DBT_INIT then
begin
PostMessage(Message.LParam,DBT_INIT,dllWndHdl,0); // das ist trocken getippt, könnte auch WParam sein
end
end

dllWndHdl := AllocateHWnd(WndProc);

Gruesse,
Guido

c113plpbr 24. Apr 2006 20:20

Re: Kommunikation zwischen (injected) DLL und Programm
 
Mit was injezierst du denn die DLL?
Wenn du es mit madCodeHook machst, werden dir die IPC-Funktionen gleich mitgeliefert, wenn du's nicht mit madCodeHook machst, kann ich dir nur dazu raten :D .
Wie auch immer, effektive Methoden können WindowMessages sein, Pipes, shared memory, oder geschicktes Arbeiten mit Mutexes/Semaphoren/Critical Sections und ReadProcessMemory bzw. WriteProcessMemory, kommt eben immer auf den Anwendungszweck/bereich an.

ciao,
Philipp


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Seite 1 von 2  1 2      

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