DllMain automatisch ausgeführt ? und wie oft ?
-
Hallo,
in Bezug auf folgende DLL Diskussion:
http://www.c-plusplus.net/forum/viewtopic.php?t=63965&highlight=dllmain
Ich hätte trotzdem gerne gewusst, ob die DllMain bei Loadlibrary automatisch
ausgeführt wird. Nachdem ich meine DLL von zwei Programmen mit Loadlibrary
Lade, müsste diese Funktion ja praktisch 2mal ausgeführt werden, was bei
einem Setzen von (shared) Variablen dumm wäre ...
-
DllMain wird aufgerufen wenn die Dll in einem Prozess geladen/enlaten wird. Wenn ein Thread gestartet und beendet wird.
LoadLibrary überprüft erst ob die Dll schon mal geladen wurde. Nur dann wird diese geladen und DllMain aufgerufen
-
Wenn ein Thread gestartet und beendet wird.Meinst du damit eine Unterfunktion der Dll ?
(also vor dem Ausführen einer Funktion kommt DllMain ?)Ansonsten: Danke für die schnelle Antwort !!
-
LoadLibrary überprüft erst ob die Dll schon mal geladen wurde.
Aber nur pro Prozess, oder?
-
Dlls sind Prozesse abhängig (auser shared sections), also ist das Überprüfen Prozess abhängig.
DllMain wird mit verschiedenen Reasons aufgerufen:
DLL_PROCESS_ATTACH -> DLL in ein Prozess geladen
DLL_PROCESS_DETACH -> DLL im Prozess entladen
DLL_THREAD_ATTACH -> neuer Thread im Prozess erstellt
DLL_THREAD_DETACH -> Thread im Prozess beendet
-
Das mit dem attach und detach habe ich nun auch in meinder DLL.
Nur das mit dem thread verstehe ich leider immer noch nicht.
Ist die Erstellung eines DLL_THREAD_ATTACH durch GetProcAdress ?
Oder handelt es sich um einen Aufruf einer Funktion der DLL
(also Start und Ende eines Aufrufes einer Funktion in der DLL) ?
-
Damit ist gemeint, wenn in deinem Prozess ein Thread gestartet wird, z.B. mit _beginThread(), dann wird der DLL bzw. allen DLLs in deinem Programm eine DLL_THREAD_ATTACH Nachricht geschickt, damit die eben bescheit wissen, weiß zwar kein Beispiel wo man das braucht, aber einfach aus Spaß wurde es sicher nicht so gemacht.
-
SirLant schrieb:
weiß zwar kein Beispiel wo man das braucht, aber einfach aus Spaß wurde es sicher nicht so gemacht.
die dll kann dann z.b. für jeden thread eigene datenstrukturen anlegen, speicher allozieren usw.