aus Dll Signal an Application schicken
-
Hallo,
ich habe einen Maus-Hook programmiert. Dieser liegt in einer Dll die nun in jeden Thread geladen wird. Nun möchte ich, das ich bei einem bestimmten Mausereigniss meine Haupapplikation benachrichtigt wird.
Es muss also eine Art Signal sein.
Wie mache ich das am besten?
Über Shared Memory?
Woher weiss dann die App. das sich eine Varibale geändert hat, wenn Sie nicht ständig mit einer Schleife nachschauen will?
-
Shared memory is nur ein Weg.
Du könntest primitov PostMessage verwenden, wenn die Informationen nicht komplex sind.
Zum Benachrichtigen ansonsten kannst Du einen Event verwenden. Den Speicher selbst für den "Shared memory" musst Du dann jedoch mit einem Mutex sichern.
-
Ansonsten siehe: Interprocess Communications [Base]
http://msdn.microsoft.com/library/en-us/ipc/base/interprocess_communications.asp
-
danke erstmal.
werd ich al durchgehen.
-
@Martin Richter:
das mit dem Event hört sich am besten an.
Der MausHook in meiner DLL soll eine Nachricht an meine Applikation schicken.
Die soll dan eine Form sichtbar machen, an Koordinaten die von der DLL kommen.
Diese Daten könnte ich doch mit shared Memory ablegen, und dann von der Applikation auslesen lassen.
Nur brauch ich noch den Event, damit die App auch weiss, wann neue Daten da sind.
Weiss nur leider nicht, wie ich das mit dem Event mache.
Wäre für Hilfe dankbar.
-
Event unter Namen erzeugen CreateEvent. Bzw. besteenden Event mit OpenEvent besorgen, oder Handle aus einem Prozess per DuplicateHandle in einen anderen vererben.
Ansonsten gibt es ja die MSDN
in der Du lesen kannst!
-
Ich habe nun folgendes an den Anfang meiner Haupt-Applikation und an den Anfang meiner Dll gestellt.
#pragma once #pragma data_seg ("drawchange") bool draw_change; #pragma data_seg () //#pragma comment(linker,"/SECTION:drawchange,RWS")Dann frage ich mit einem Buttin den Wert von draw_change ab, und ändere eine Checkbox entsprechend.
Intern, also im jeweiligen Programm ist die Variable vorhanden, leider nur nicht im anderen Prozess.
Was mache ich falsch?
-
So funktioniert das nicht! Du kannst nur Speicher im selben Modul sharen. Also zwischen DLL in Prozess 1 und der gleichen DLL im Prozess2!
Es geht nicht zwischen unterschieldichen Modulen!
-
aha. Das ist doof. Jetzt weiss ich nicht mehr weiter.
Hast Du einen Vorschlag, oder vielleicht sogar einen konkreten Ansatz?
In der MSDN kann ich schon lesen, nur gibt es dort viel zu lesen, und es ist oft schwierig aus einer allgemeinen Beschreibung etwas konkretes abzuleiten.
Gibt es sowas vielleicht schon als Code ( so was ähnliches halt) ?
-
Wo ist Dein Problem? Lade die DLL auch in Deinen Prozess. Bau Dir eine Funktion mit der Du auf diese Daten zugreifen kannst.