Grundverständnis Win32 DLL Messages
-
Hallo,
ich habe ein Verständnisproblem mit DLLs, aus denen Windows messages heraus geschickt werden. Folgendes Szenario: Ich habe eine (Fremd-)DLL, die ich mit LoadLibrary() lade und einen Zeiger darauf benutze, um gewisse Funktionen aufzurufen. Die DLL schickt eine selbst generierte message WM_TAG die definiert ist als
#define WM_TAG WM_USER + 11111Dazu muss ich sagen, dass ich in Qt4 programmiere und die Win32-Funktionen nur zum Einbinden der DLL brauche. Wenn ich die DLL jetzt in meinem Qt-Hauptprogramm lade und in Qt mittels
bool QWidget::winEvent(MSG* msg, long* result)alle Windows messages abfange, bekomme ich auch die Message aus der DLL. So weit so gut.
Aber wenn ich versuche, die DLL von einer anderen (Qt-)DLL aus zu laden (die Qt-DLL definiert ei QWidget, das die entsprechende winEvent-Funktion überschreibt), bekomme ich die Message nicht mehr, d.h.
DLL --- Win-message ---> Application: Funktioniert
DLL --- Win-message ---> DLL : Funktioniert nicht ??Deshalb meine Frage: Wohin werden die Messages von DLLs geschickt, in meinem Win32-Buch steht, dass sie immer an das Hauptprogramm geschickt werden, welches die DLL geladen hat, aber was, wenn ich eine DLL durch eine andere DLL lade?
Danke für alle Hinweise,
AlGaN
-
an das hwnd, was du bei SendMessage angibst....
-
Versuche es mal so:
DLL -- win message --> application --> win message --> 2. DLL
Die Applikation sowie alle beteiligten DLLs haben jeweils eigene Fenster-Handles, über die sie miteinander kommunizieren können. Wenn der direkte Weg von DLL nach DLL nicht funktioniert, dann die Message über die Applikation durchreichen.
-
@ascda: Ja, würde ich gerne, leider bin ich nicht im Besitz des Source-Codes der DLL, welche die Message schickt, weiß deshalb auch nicht, an welchen Handle die Message mit SendEvent() geschickt wird...
@berniebutt: Danke für die Antwort, werd den Umweg mal versuchen, ist nur etwas ungünstig, da mein Programm fast nur aus DLLs besteht, die Applikation macht nichts anderes als Objekte zu erzeugen, die in DLLs liegen... (weshalb ich auch die DLL aus einer DLL heraus lade)
-
Es geht auch direkt von DLL nach DLL! Hierzu muss man für jede DLL einen moduslosen Dialog einrichten, dessen Fenster-Handles HWND über die Applikation (oder die steuernde DLL) den anderen DLLs mitgeteilt werden. daddeldu
-
DLLs haben nichts mit Nachrichten zu tun, nur Fenster!
Wer dasFenster angelegt hat (ob DLL oder EXE) ist Windows egal.Es gibt also so etwas wie "Nachricht an DLL" gar nicht!

-
berniebutt schrieb:
Es geht auch direkt von DLL nach DLL! Hierzu muss man für jede DLL einen moduslosen Dialog einrichten, dessen Fenster-Handles HWND über die Applikation (oder die steuernde DLL) den anderen DLLs mitgeteilt werden. daddeldu
Wieso pushst du einen fertigen thread?
-
@asda: Weil ich dem Fragesteller noch etwas mitteilen wollte, was er gesucht hatte.
@Martin Richter: Hier liegst Du falsch. DLLs können sehr wohl untereinander Nachrichten austauschen. Ich habe das ausprobiert!
-
LOL berniebutt ist ein ausgefuchster Provokateur.
-
berniebutt schrieb:
@Martin Richter: Hier liegst Du falsch. DLLs können sehr wohl untereinander Nachrichten austauschen. Ich habe das ausprobiert!
Blödsinn! Keine DLLs tauschen hier Nachrichten aus, sondern Fenster!
Oder es sind die Prozesse die die Nachrichten austauschen. Nicht die DLLs! Darauf will ich hinaus. DLLs sind Container für Code. Aber Nachrichten beziehen sich immer auf den Prozess, Thread und das Fenster. Wo der Code liegt (DLL,EXE) ist dem System egal.
Es gibt keinerei Einschränkungen oder Besonderheiten wenn man Code in einer LDL hat und dieser SendMessage ausführt. Die Fragestellung ist also schon irreführend, falsch und eng!
-
@ asdca / Martin Richter: Ich bin weder ein ausgefuchster Provokateuer noch teile ich in diesem Forum allein Blödsinn mit.
Ich hatte vorgeschlagen, den DLLs einen moduslosen Dialog (hat ein Fenster-Handle) hinzuzufügen, dessen Dialog-Funktion gesendete Nachrichten entgegennimmt. Eine DLL bekommt so ein Gegenstück zu WndProc der Applikation. Damit war die Fragestellung des Themas beantwortet.
Dieser Dialog kann unsichtbar und völlig leer sein:
DLLid DIALOG 0,0,0,0
BEGIN
ENDDas ganze läuft so: die Applikation ruft als erste Anforderung eine DLL-Funktion DLLidInit(hwndApp,...) auf. DLLidInit richtet mit CreateDialog den moduslosen Dialog ein und teilt der Applikation dessen Fenster-Handle sowie ihre id mit: SendMessage(hwndApp,DLL_HWND,id,(LONG)hwndDLL). Die Applikation teilt dann genauso allen DLLs die Fenster-Handles der anderen DLLs mit. Das ist schon der gesamte notwendige Programmüberbau, der sich leicht standardisieren lässt. Dem direkten Senden von Nachrichten zwischen DLLs steht nichts mehr im Wege. Was die DLLs damit machen, bleibt im Ermessen der Aufgabenstellung.
Ich betrachte diesen Vorschlag als allgemein interessant, Man kann damit ein nützliches Werkzeug für die Software-Entwicklung und die Programmpflege schaffen. Ich habe das Funktionieren mit Testanwendungen ausreichend verifiziert.
Alles klar auf der Andrea Doria!