DLL_PROCESS_DETACH



  • Du kannst in DllMain auch nicht auf das Beenden des Threads warten.
    Das einzige was du tun kannst ist checken dass er wirklich schon weg ist, und dann das Handle freigeben.



  • alos genau das ist ja das Problem der Thread wird einfach zerstört wodurch die tread beendet Variable aber nicht gesetzt wird. Dadurch hängt der sich dann in der Schleife auf.

    Wie kann man das denn dann anders machen? Ich möchte einen Tread in meiner Dll laufen haben ohne das ich erst eine Funktionen in meiner DLL vom Typ Init und Exit die jeweils den Thread starten oder beenden.

    MfG


  • Mod

    Wie schon gesagt wurde.
    Du kannst den Thread starten aber der Thread läuft nicht an, weil Du DllMain blockierst!

    Wenn es Dir egal ist wann der Thread beendet dann kannst Du es machen.
    Grundsätzlich: Man kann in DllMain nicht auf Threads oder Ereignisse warten, die den Threads des eigenen Prozesses betreffen!
    Oder man sollte es tunlichst nicht tun, da man einen deadlock bekommt!

    Darum herum gibt es keine Lösung!
    Bau eine Init Funktion 😉



  • Hi,

    also der Thread läuft an. Er bekommt auch Rechenzeit.
    Ich blokiere die DllMain ja erst beim beenden. Und da ist auch meine eigentliche frage: Warum mein Thread da schon aus ist (laut Process Explorer)?

    MfG



  • Wo wird denn Dein "hThread" gelöscht??? Der Thread macht dies nicht automatisch!
    Das beste ist einfach mittels WaitForSingleObject auf das Handle zu warten. Dies wird dann signalisiert, wenn der Thread beendet ist.
    Dies sollte man natürlich nie aus DllMain machen, da Du hier ja den Loader-Lock hälst und dies dann zu sehr "komischen" nebeneffekten und hängern führen kann...



  • das wüßte ich ja auch gern wie oder wo mein thread gelöscht wird.

    Wenn ich einen Breakpoint auf das if bei DLL_PROCESS_DETACH setze und dann in den Prozess Explorer kuck ist dieser Prozeß nicht da. Dann brauch ich mich ja nicht wundern wenn der nicht mehr aus der while schleife kommt.

    MfG



  • Ich dachte erst dein Thread wird vorher sauber beendet.
    Wenn er das nicht wird, dann wird vermutlich einfach irgendwo ::ExitProcess aufgerufen, und das tötet alle Threads.

    Und bei DLL_PROCESS_DETACH sind natürlich schon alle Threads futsch, das sollte klar sein (ausser die DLL wurde dynamisch geladen und vor Ende des Programms wieder freigegeben).



  • also wenn die DllMain mit DLL_PROCESS_DETACH aufgerufen wird heißt das die Dll wurde durch FreeLibrary beendet oder wenn man die DLL über die Lib eingebunden hast wurde dieses Programm beendet was ebenfalls die Dll beendet.
    Alle Threads der Dll sind damit auch gekillt worden.

    Verstehe ich das so richtig?

    Das würde ja heißen das diese Nachicht DLL_PROCESS_DETACH eigentlich zu nix mehr nütze ist.

    Dann ist natürlich die Frage wie ich meinen Thread sauber beenden kann ohne das ich eine Funjtion Exit in die Dll einbaue.

    MfG


  • Mod

    Ja! Die Doku hierzu ist doch eindeutig:

    When a DLL is unloaded from a process as a result of an unsuccessful load of the DLL, termination of the process, or a call to FreeLibrary, the system does not call the DLL's entry-point function with the DLL_THREAD_DETACH value for the individual threads of the process. The DLL is only sent a DLL_PROCESS_DETACH notification. DLLs can take this opportunity to clean up all resources for all threads known to the DLL.

    If you terminate a process by calling TerminateProcess or TerminateJobObject, the DLLs of that process do not receive DLL_PROCESS_DETACH notifications. If you terminate a thread by calling TerminateThread, the DLLs of that thread do not receive DLL_THREAD_DETACH notifications.



  • Also wenn die meldung kommt sind alle Threads schon gekillt.

    Dann muß ich mir wohl doch ne Exit Funktion bauen welche den Thread sauber beendet.

    MfG


Anmelden zum Antworten