Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Messages einer DLL abfangen (https://www.delphipraxis.net/160910-messages-einer-dll-abfangen.html)

nytaiceman 7. Jun 2011 14:50

Messages einer DLL abfangen
 
Hallo zusammen,

Ich benutze eine Funktion einer DLL, das funktioniert soweit einwandfrei.

Die DLL selbst gibt aber Messages als Messagebox aus. Diese Texte würde ich aber gerne weiterverwenden (z.B. in ein Logfile etc).

Ich habe versucht, mittels einer generellen Message Abfrage, an den Text zu kommen, das ist mir aber noch nicht ganz gelungen, weil ich damit nur eine Messagenummer erhalte, nicht aber den Text der angezeigt wird:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
protected
    procedure WndProc(var Message: TMessage); override;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation
{$R *.dfm}
 ...

// === Receive ALL Messages send to my Form =========================
procedure TForm1.WndProc(var Message: TMessage);
begin
 WriteLog('Messaging',Message.msg); // Write Message to Logfile
end;
Wie komme ich an den eigentlichen Text der in der aufgerufenen MessageBox angezeigt wird?
Oder ist das gar kein Messageevent?

Danke bereits im voraus.

Bernhard Geyer 7. Jun 2011 14:54

AW: Messages einer DLL abfangen
 
Wenn die DLL die MessageBox-API von Windows aufruft würde es am einfachsten gehen die API-Funktion zu hooken damit erst deine Hilfsfunktion zum loggen aufgerufen wird un dann die WinAPI-Funktion. In der JCL gibt es Klassen die das Hooking von DLL-Funktionen vereinfacht.

nytaiceman 8. Jun 2011 23:15

AW: Messages einer DLL abfangen
 
Hallo Bernhard,

danke für den Tipp aber ich vermute es muss einen einfacheren Weg geben.
Mit der JclHookExcept erhalte ich ja globale Exceptions und jegliche anderen Infos.

Kann man nicht über das THandle der geladenen DLL die sichtbaren Ausgaben in Form von Messageboxen irgendwie abfangen?
Delphi-Quellcode:
Handle := LoadLibrary(PChar('example.dll'));
Die Funktion in der DLL die ich aufrufe meldet über Messageboxen den jewieligen Status. Diese Boxen müssen aber danach mit einem Klick bestätigt werden, damit die Funktion weiterläuft.

Durch ein Hooking oder ähnlichem dieser Messageboxen der DLL könnte ich das umgehen.

Hat jemand eine weitere Idee?

Luckie 8. Jun 2011 23:32

AW: Messages einer DLL abfangen
 
Steht der Nachrichtentext eventuell in WParam oder LParam?

wicht 8. Jun 2011 23:38

AW: Messages einer DLL abfangen
 
Zitat:

Mit der JclHookExcept erhalte ich ja globale Exceptions und jegliche anderen Infos.
Die Unit selbst sieht nicht danach aus. Keine Ahnung, ob Es da noch was anderes bei den Jedi-Sachen gibt. Recht gute Erfahrungen habe ich mit der uallCollection von brechi gemacht. Die Methode müsste HookCode in uallHook.pas sein. Beispiele gibt auch, wenn du dem Link folgst.

nytaiceman 10. Jun 2011 07:21

AW: Messages einer DLL abfangen
 
Hallo zusammen,

Ich habe nun die DLL noch etwas genauer angeschaut und durch weiteres Reverse Engineering herausgefunden, das ich VOR dem Aufruf einer Funktion aus der DLL, das Logging/Messaging initialisieren kann und direkt in eine Logdatei schreiben lassen kann (Der Speicherort und der Name der Logdatei ist aber scheinbar in der DLL fix verdrahtet).

Das ist immerhin schon nicht schlecht, jetzt muss ich halt ein Logfile parsen um an die gewünschten Informationen zu kommen.

Das Hooking hat bei mir nur für Exceptions geklappt, nicht aber für "normale" Messages, ich scheine das aber auch nicht vollständig verstanden zu haben und muss das bei Gelegenheit nochmals genauer anschauen und versuchen umzusetzen.

Ein Merci nochmals für eure Hilfe :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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