Warum rufen Sie nicht von Freeeintrittspunktfunktion?
-
19-09-2019 - |
Frage
Ich schreibe eine DLL, dass Bedarf eine separate DLL mehrmals dynamisch nennen. Ich mag die Angerufene geladen halten und es dann nur entladen, wenn mein DLL entladen wird. Aber nach Microsoft, das ist eine schlechte Idee .
Die Eintrittspunktfunktion sollte nur führen einfache Initialisierung Aufgaben und sollten keine anderen DLL aufrufen Lade- oder Terminierungsfunktionen. Zum beispielsweise in der Eintrittspunktfunktion, Sie sollten nicht direkt oder indirekt rufen Sie die Funktion Loadlibrary oder die LoadLibraryEx Funktion. Zusätzlich, Sie sollten nicht die Free nennen Funktion, wenn der Prozess Abschluss.
Hier ist der säumige Code. Kann jemand erklären, warum ich nicht Loadlibrary und Freelibrary von meinem DLL Einstiegspunkt nennen sollte?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH :
if (hLogLib != NULL) FreeLibrary(hLogLib);
break;
}
return TRUE;
}
Lösung
Ich glaube, ich gefunden habe die Antwort .
Die Einstiegspunktfunktion sollte führen nur einfache Initialisierung oder Abschlussaufgaben. Es darf nicht nennen die Loadlibrary oder LoadLibraryEx Funktion (oder eine Funktion, dass Anrufe diese Funktionen), da im Mai dieses Jahres Abhängigkeitsschleifen in der DLL erstellen Ladereihenfolge. Dies kann in einer DLL führen verwendet wird, bevor das System aufweist seine Initialisierungscode ausgeführt. Ähnlich der Funktion der Einstiegspunkt darf die Freelibrary-Funktion aufrufen (Oder eine Funktion, die Free aufruft) während Prozessbeendigung, weil Dies kann in einer DLL zur Folge haben wird, verwendet nachdem das System ausgeführt sein Beendigungskode.
Andere Tipps
Sie können nicht Loadlibrary von Ihrem Einstiegspunkt nennen, weil die DllMain Funktion läuft innerhalb eines OS-Loader Schloss und alle Versuche, diese Lader Sperre wieder zu erlangen (zB durch Loadlibrary Aufruf) wird in einer Sackgasse führen.
Do not do etwas von Folge innerhalb von DLLMain. Ernsthaft. Free Aufruf ist noch schlimmer, weil es wird nur manchmal Deadlock, wenn es passiert, dass Sie Ihre freien Verringerungen der refcount auf Null gesetzt und die Bibliothek tatsächlich freigegeben wird.