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;
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top