AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Hook - Datenaustausch - MMF?

Ein Thema von golisan · begonnen am 17. Aug 2007 · letzter Beitrag vom 22. Aug 2007
Antwort Antwort
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#1

Hook - Datenaustausch - MMF?

  Alt 17. Aug 2007, 18:32
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!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Hook - Datenaustausch - MMF?

  Alt 17. Aug 2007, 19:07

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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Hook - Datenaustausch - MMF?

  Alt 17. Aug 2007, 21:15
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"
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Hook - Datenaustausch - MMF?

  Alt 17. Aug 2007, 22:05
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Hook - Datenaustausch - MMF?

  Alt 18. Aug 2007, 15:36
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Hook - Datenaustausch - MMF?

  Alt 18. Aug 2007, 17:32
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
golisan

Registriert seit: 17. Jan 2007
43 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Hook - Datenaustausch - MMF?

  Alt 22. Aug 2007, 00:53
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...

Kannst du vielleicht mal ein kleines Beispiel posten?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Hook - Datenaustausch - MMF?

  Alt 22. Aug 2007, 13:30
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:08 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