Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hook - Datenaustausch - MMF? (https://www.delphipraxis.net/97871-hook-datenaustausch-mmf.html)

golisan 17. Aug 2007 17:32


Hook - Datenaustausch - MMF?
 
Hallo Leute,

habe hier schon einiges über MMFs und Pipes gelesen aber das ganze ist(für mich) etwas zu kompliziert.
Vielleicht gibt es ja doch noch etwas einfacheres...
Folgendes will ich machen...
In einer Fremdanwendung(sagen wir mal WORD), drücke ich auf einen ToolBar-Button, dabei wird ein Hook installiert(aus einer DLL).
Der InstallHook-Funktion gebe ich das Fenster-Handle und einen zusätzlichen Integer-Wert mit.
Diese beiden Werte soll sich die DLL "merken".
Starte ich jetzt nochmal Word und drücke wieder den Button, soll der Hook natürlich nicht nochmal installiert werden, aber das (neue) Fenster-Handle und der zusätzliche (neue)Integer-Wert soll sich die Hook-Dll merken.(also nix anderes als eine Liste)
Das klappt auch!
So, bei bestimmten Nachrichten wird mein Hook aktiv und soll prüfen, ob das Handle/die Anwendung, welches die Nachricht ausgelöst hat, in dieser Liste ist.
Tja und da ist das Problem, die Liste ist leer. :?
Gibt es eine andere Möglichkeit ausser MMF/Pipes ... oder habe ich da generell einen Denkfehler drin?
Danke!

sirius 17. Aug 2007 18:07

Re: Hook - Datenaustausch - MMF?
 
:gruebel:
1. Musst du nicht erst den Hook installieren um das Drücken eines Toolbuttons bei Word mitzubekommen?
2. Welches Fensterhandle gibst du der DLL mit?
==> ich werde aus dem Post nicht schlau.

golisan 17. Aug 2007 20:15

Re: Hook - Datenaustausch - MMF?
 
Es geht nicht darum, den ToolBar-Click abzufangen.
Der Hook wird eben erst durch drücken dieses Buttons aktiviert. Im Prinzip könnte er auch schon vorher durch "was anderes" aktiviert worden sein, das ist egal.
Wenns nicht verständlich war.... was ich eigentlich machen will.
Ich schreibe ein PlugIn für eine IDE einer anderen Programmiersprache und erst, wenn dieses PlugIn in dieser IDE aktiviert wurde, soll der Hook aktiv sein.
Wird dieses Plugin aktiviert gebe ich der InstallHook-Funktion das Fensterhandle des MDI-Frames(der IDE) und ein Handle auf ein Objekt mit.(welches von dieser IDE erzeugt wurde, ein IDispatch). Das klappt ja auch alles.
Der Hook reagiert auf die rechte Maustaste und erweitert das Kontextmenü.
Um aber das Kontextmenü richtig erweitern zu können, muss ich wissen, in welcher IDE ich mich befinde(kann mehrfach gestartet werden!) und ich brauche dann eben das Handle des Objektes, welches ich beim InstallHook mitgegeben habe.
Und diese Zuordnung geht "flöten" :wall:

SirThornberry 17. Aug 2007 21:05

Re: Hook - Datenaustausch - MMF?
 
beim installieren eines Hook wird in etwa nichts anderes gemacht als die DLL in andere Prozesse zu laden. Wenn du jetzt beim installieren des Hook etwas in die DLL übergibst ist es aber nur in dieser DLL-Instanz und nicht in den DLL-Instanzen welche von den anderen Prozessen geladen wird! Dementsprechend musst du die Daten irgendwo ablegen wo alle DLL-Instanzen ran kommen. Und wären im einfachsten fall MemoryMappedFiles, Pipes oder wenn es gar nicht anders geht eine normale Datei.

Es werden also nicht (wie oftmals angenommen) alle Dinge durch die Hook-Procedure deiner einen geladenen DLL geschleust sondern die DLL wird in mehrere Prozesse injeziert.

(ich weiß das es windowsintern etwas anders läuft, aber so ist es glaub ich am verständlichsten)

golisan 18. Aug 2007 14:36

Re: Hook - Datenaustausch - MMF?
 
Hallo,

danke für die Infos. Habe sowas schon "befürchtet" :?
Habe mal im Forum gestöbert und das gefunden Pipes
Das sieht ja erst mal nicht schlecht aus... aber irgendwie habe ich da Probleme "mein" Array unterzubringen.
Ich brauche eine Funktionalität wie:
- rufe DLL-Funktion mit 2 Parametern(Cardinal und IDispatch)
-- in DLL hole die bereits gespeicherten Werte aus der Pipe
-- falls noch nicht vorhanden, hänge das neue Paar hinten an und speichere das ganze wieder in der Pipe

geht sowas mit Pipes?

Danke!

SirThornberry 18. Aug 2007 16:32

Re: Hook - Datenaustausch - MMF?
 
wie es mit pipes geht weiß ich nicht. Ich hab das ganze bisher immer so gemacht:
1.) in ein MMF nur das Handle meines Hauptforms (bzw. das Handle eines Fensters aus der DLL des Hauptforms) gepackt
2.) Hook installiert
3.) die DLLs lesen das Handle aus der MMF und kommunizieren über Messages mit dem Hauptform und holen sich alle benötigten Infos.

Alternativ kannst du auch einfach einen Server (http etc.) machen und in den DLLs ist jweils ein client der zum server verbindet und sich die infos holt.

es gibt auch noch folgende Variante
- Im Hauptprogramm mit RegisterWindowMessage 2 MessageIdentifier geben lassen
- Hook installieren
- Die DLLs holen sich mit RegisterWindowMessage auch die 2 MessageIdentifier
- Die DLLs schicken per Broadcast ihr Handle an den ersten MessageIdentifier
- Das Hauptprogramm wartet auf die message und schickt beim ankommen sein Handle mit dem 2ten Messageidentifier an die DLL zurück.

Die letztere Variante sollte die sein welche eigentliche auf den verschiedensten Windowsversionen läuft.

golisan 21. Aug 2007 23:53

Re: Hook - Datenaustausch - MMF?
 
Hi Jens,

deine "letzte" Variante hört sich gut an.
Aber irgendwie bekomme ich das nicht "gebacken"...
Messages kann ich (in einer Form) doch so empfangen:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    procedure fremderAufruf (var Msg : TMsg) ; message WM_MyMessage;
  end;
Aber wo definiere ich nun WM_MyMessage?
Delphi mag an der Stelle nur Konstanten haben... :pale:

Kannst du vielleicht mal ein kleines Beispiel posten?

Danke

sirius 22. Aug 2007 12:30

Re: Hook - Datenaustausch - MMF?
 
z.B.:
Delphi-Quellcode:
const WM_mymessage=WM_User+1;
      WM_othermessage=WM_User+2;
      ...
      WM_somethingelse=WM_User+100;
      ...
      //ich weis nicht genau wo das Ende liegt, aber es ist ausreichend Platz
Du kannsta auch direkt WM_User+1 hinter die Methodendeklaration schreiben. Hauptsche die Konstante ist in allen Programmen/Threads/etc. von dir gleich und wird nicht mehrmals benutzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.

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