Die Erstellung eines Threads in der DllMain?
Es scheint, dass wenn ein thread erstellt wird von innerhalb von DllMain auf DLL_PROCESS_ATTACH
es wird nicht beginnen, bis alle dll ' s geladen wurden. Da ich sicher, dass der thread läuft, bevor ich weiter, bekomme ich eine Sackgasse. Gibt es eine Möglichkeit zu zwingen, den thread zu starten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie das nicht tun, werden alle API-Aufrufe, vor allem für Dinge wie das erstellen von threads oder windows, aus DLLMain aufgerufen. Raymond Chen hat darüber geschrieben, das viele Male; hier ist ein das ist besonders relevant.
DllMain
ist sehr schlecht, egal, welche Art von Objekt Sie gewartet haben. In der Regel jeden thread, der die Ausführung von code aus einer DLL haben muss, um einen Verweis für die Zählung auf, dass die DLL, die weniger dem code zugeordnet, unter es. Das verhindert, dass das Problem immer Auftritt, daDllMain
dann nicht aufgerufen werden (für Prozess trennen), solange der thread aktiv ist.CreateThread
sicher sein kann, genannt vonDllMain
(vorausgesetzt, Sie sind ok mit ihm gekündigt wird und nicht durch Aufruf einer Funktion warten), es ist immer noch eine schlechte Idee, für genau den genannten Gründen in Raymond ' s blog-post: wenn die DLL wird kurz geladen und entladen wird durch eine andere abhängige DLL, die Sie nicht wollen werden, wodurch unnötige Ressourcen (wie Fäden) in diesem Szenario.CreateThread
ausDllMain
ist sicher (wenn auch nicht empfohlen).Was macht Ihr thread zu tun?
Werden, wenn Sie versuchen, sich zu bewegen-Zeug auf einen zweiten thread zu vermeiden Sie Einschränkungen auf, was Sie tun können, innerhalb von DllMain, Pech gehabt. Das sind keine Beschränkungen, was DllMain tun können, sind Sie Einschränkungen auf, was kann getan werden, während DllMain ausgeführt wird (und der hält die loader-lock). Wenn dein thread muss, um den loader zu sperren, wird es warten, bis der erste thread beendet ist, es zu verwenden. Wenn dein thread nicht brauchen, die Sperre des Ladeprogramms ich nicht sehen, warum es konnte nicht sofort weitermachen... aber es gibt keine solche Sache wie ein thread, der braucht nicht den loader zu sperren. Windows schicken muss, DLL_THREAD_ATTACH-Nachrichten an alle DLLs, bevor der thread kann mit dem laufen beginnen, was bedeutet, es fordert auch Ihre eigenen DllMain-und Windows-schützt vor re-entrancy.
Es gibt keinen Weg, um dieses. Der thread kann nicht beginnen, bis nach DLL_THREAD_ATTACH Verarbeitung, und das kann nicht passieren, während dein Erster thread ist innerhalb von DllMain. Die einzige Möglichkeit um ihn herum ist, um einen neuen Prozess starten (hat einen unabhängigen Bootloader sperren und nicht sperren warten auf Euch).
CreateThread()
für eine sehr einfache Arbeiter Funktion in einemDLLMain()
während der Verarbeitung einesDLL_PROCESS_ATTACH
Nachrichten. Die thread-Funktion verwendetSleep()
für 1000 Millisekunden. Alles hat gut funktioniert. Ich konnte sehen, wie dieDLL_THREAD_ATTACH
Nachrichten undDLL_THREAD_DETACH
Nachrichten sowohl aus dem ursprünglichen thread zu tun dieDLL_PROCESS_ATTACH
und den thread erstellt, während des befestigen der Verarbeitung. Aber dieser Arbeitsthread Tat nichts anderes als dieSleep()
. Kernel32.dll Anrufe sollen in Ordnung sein. Getestet mit VS 2005-Windows-7.Nicht. Sie sollten nicht nennen CreateThread (oder jede Variation) von DllMain aufgerufen. Sie versuchen, zu synchronisieren, führt in eine Sackgasse. Was genau wollen Sie tun?
Best Practices für das Erstellen von DLLs
Sind Sie für Probleme Fragen wenn Sie dies tun. Sollte man nicht machen, alle Anrufe (direkt oder indirekt) Funktionen, die außerhalb der dll ' s (einschließlich der C-Bibliothek ruft, etc.).
Wenn Sie können nicht ändern die DLL, die Sie haben (z.B. Sie haben keine source-code), Sie könnte in der Lage sein, um Weg mit diesem, wenn die DLL dynamisch geladen, nachdem der rest von Ihr abhängigen DLL ' s werden initialisiert. Ich würde nicht empfehlen diese Methode, wenn Sie es vermeiden können, weil das herausfinden der Abhängigkeiten Kette ist nicht immer trivial ist (z.B. wenn Ihre dll bewirkt, dass eine abhängige dll zu laden, in einem Dritten die dynamisch über COM oder auf andere Weise).