Welche Nachricht wenn Dialog geschlossen wird
-
In meiner DLL wird ein Dialog von einer Fremdapplikation geöffnet. Nun wird dieser Dialog von dieser Applikation auf unerklährliche Weise geschlossen.
Nun wollte ich dieses schliesen Abfangen. Die Nachrichten WM_CLOSE und WM_DESTROY habe ich schon abgefangen. Allerdings werden diese in meinem Fall nicht gesendet. Gibt es noch andere Nachrichten die das Schliessen des Dialogs zur Folge hat?
-
Übrigens: Der Destruktor wird auch nicht durchlaufen.
-
Könnte es sein, dass der Thread einfach terminiert. Dnan wird Dein fenster auch ohne weitere Nachricht brutal entsorgt!
Kontrolliere mal im Debugger die Thread ID!
-
Könnte es sein, dass der Thread einfach terminiert.
Ja kann sein. Aber was mache ich dagegen?
-
Es ist nicht schlimm das der Dialog an der Stelle geschlossen wird.
Nur möchte ich den Dialog wieder zu einem anderen Zeitpunkt wieder öffnen. Allerdings wurde der Dialog beim Instanzieren der DLL angelegt. Und nun ist er futsch.
-
1. Kannst Du nichts dagegen tun, wenn der Thread beendet wird. Du kannst das in Deiner DLL allerdings in DllMain mitbekommen.
2. Was meinst Du mitsister schrieb:
Nur möchte ich den Dialog wieder zu einem anderen Zeitpunkt wieder öffnen. Allerdings wurde der Dialog beim Instanzieren der DLL angelegt. Und nun ist er futsch.
Wir hast Du den Dialog angelegt?
-
Kannst Du nichts dagegen tun, wenn der Thread beendet wird.
Nein
Du kannst das in Deiner DLL allerdings in DllMain mitbekommen.
Und wie?
Den Dialog habe ich in InitInstance mit
m_dialog = new MyDialog(); m_dialog->Create(IDD_DIALOG_MY);
angelegt. Dazu habe ich dann den Handle abgespeichert. Und über diesen Zeige ich den Dialog an.
Nachdem der Dialog aber an der besagten Stelle geschlossen wurde. Habe ich zwar das Handle noch. Aber der Dialog lässt sich darüber nicht mehr starten. Weil der Dialog zerstört wurde.
-
Dann würde ich mal sagen, dass Dein Ansatz falsch ist den Dialog dort zu öffnen wo die DLL geladen wird...
-
Dann würde ich mal sagen, dass Dein Ansatz falsch ist den Dialog dort zu öffnen wo die DLL geladen wird...
Mein Dialog wird dort nicht geöffnet sondern nur erzeugt. Wann soll ich ihn den sonst erzeugen? Der soll verfügbar sein nachdem die DLL geladen wurde.
Du kannst das in Deiner DLL allerdings in DllMain mitbekommen.
Nochmals wie?
-
Was meinst Du mit erzeugt? Nur das Objekt oder auch das Fenster?
Bzgl. Threadende lies doch enfach die Doku zu DllMain!
Da steht doch alles.
http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspxDLL_THREAD_DETACH
3 A thread is exiting cleanly. If the DLL has stored a pointer to allocated memory in a TLS slot, it should use this opportunity to free the memory. The system calls the entry-point function of all currently loaded DLLs with this value. The call is made in the context of the exiting thread.
-
Was meinst Du mit erzeugt? Nur das Objekt oder auch das Fenster?
Beides!
-
Das mit der DLLMain ist doch aber dasselbe wie ExitInstance.
DLLMain wird laut Hilfe 2 mal aufgerufen beim Laden und Entladen der DLL.Es gibt ja aber auch InitInstance und ExitInstance. Die jeweils beim start oder beenden der DLL aufgerufen werden. Problem bei mir ist aber dass die DLL gar nicht entladen wird.
-
Du irrst DllMain wird für jeden Thread aufgerufen, der startet und stribt wenn die DLL im Prozessraum ist.
Lies doch bitte die Doku!Das die MFC für zwei spezielle Init- und ExitInstance draus macht ist ja wieder wasanderes.
-
Warum klappt eigentlich nie was auf das erste mal. Und ich muss dann immer wegen jeder Kleinigkeit nachfragen.
Ich habe jetzt einfach mal die Funktion so implementiert:
BOOL WINAPI DllMain( __in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved ) { AfxMessageBox("DllMain"); return TRUE; }
Und erhalte nun einen Linkerfehler:
error LNK2005: _DllMain@12 ist bereits in nafxcwd.lib(dllmodul.obj) definiert.
was mache ich den nun schon wieder falsch?
-
Wenn Du die MFC verwendest, dann hast Du keinen Zugriff direkt auf die DllMain.
Siehe auch:
http://support.microsoft.com/kb/148791/en-us
HTH
-
Wenn Du die MFC verwendest,
Na klar verwende ich die MFC. Sonst wäre ich ja in einem anderen Forum.
dann hast Du keinen Zugriff direkt auf die DllMain.
Na super.