CoFreeUnusedLibrariesEx-Funktion (combaseapi.h)
Entlädt alle DLLs, die nicht mehr verwendet werden und deren Entladeverzögerung abgelaufen ist.
Syntax
void CoFreeUnusedLibrariesEx(
[in] DWORD dwUnloadDelay,
[in] DWORD dwReserved
);
Parameter
[in] dwUnloadDelay
Die Verzögerung in Millisekunden zwischen dem Zeitpunkt, zu dem die DLL angegeben hat, dass sie entladen werden kann, bis sie zu einem Kandidaten für das Entladen wird. Wenn Sie diesen Parameter auf INFINITE festlegen, wird die Systemstandardverzögerung (10 Minuten) verwendet. Wenn Sie diesen Parameter auf 0 festlegen, wird das Entladen aller DLLs ohne Verzögerung erzwungen.
[in] dwReserved
Dieser Parameter ist reserviert und muss 0 sein.
Rückgabewert
Keine
Bemerkungen
COM stellt Funktionen zur Rückgewinnung von Speicher bereit, der von DLLs mit Komponenten gehalten wird. Die am häufigsten verwendete Funktion ist CoFreeUnusedLibraries. CoFreeUnusedLibraries gibt DLLs ohne aktives Objekt nicht sofort frei. Es gibt eine 10-minütige Verzögerung für Multithread-Apartments (MTAs) und neutrale Wohnungen (NAs). Bei Single-Threaded Apartments (STAs) gibt es keine Verzögerung.
Die zehnminütige Verzögerung für CoFreeUnusedLibraries besteht darin, Multithread race-Bedingungen zu vermeiden, die durch das Entladen einer Komponenten-DLL verursacht werden. Diese Standardverzögerung kann für viele Anwendungen zu lang sein.
COM verwaltet eine Liste der aktiven DLLs, für die Komponenten für die Apartments geladen wurden, die in dem Thread gehostet werden können, in dem diese Funktion aufgerufen wird. Wenn CoFreeUnusedLibrariesEx aufgerufen wird, hat jede DLL in dieser Liste ihre DllCanUnloadNow-Funktion aufgerufen. Wenn DllCanUnloadNow S_FALSE zurückgibt (oder nicht exportiert wird), ist diese DLL nicht zum Entladen bereit. Wenn DllCanUnloadNow S_OK zurückgibt, wird diese DLL von der aktiven Liste in eine Liste "Kandidaten für das Entladen" verschoben.
Das Hinzufügen der DLL zur Liste Kandidaten für das Entladen zeitstempelt die DLL dwUnloadDelay Millisekunden ab, wenn diese Verschiebung erfolgt. Wenn CoFreeUnusedLibrariesEx (oder CoFreeUnusedLibraries) erneut aufgerufen wird, mindestens dwUnloadDelay Millisekunden aus dem Aufruf, der die DLL in die Liste Kandidaten für das Entladen verschoben hat, wird die DLL tatsächlich aus dem Arbeitsspeicher freigegeben. Wenn COM die Komponenten-DLL verwendet, während sich die DLL in der Kandidatenliste für das Entladen befindet, wird sie zurück in die aktive Liste verschoben.
Das Festlegen von dwUnloadDelay auf 0 kann unerwartete Folgen haben. Die Komponenten-DLL benötigt möglicherweise einige Zeit für die Bereinigung, nachdem sie von der DllCanUnloadNow-Funktion zurückgegeben wird. Wenn die DLL beispielsweise über eigene Workerthreads verfügt, würde die Verwendung des Werts 0 höchstwahrscheinlich zu einem Problem führen, da der code, der für diese Threads ausgeführt wird, nicht zugeordnet wird, was durch das Entladen der DLL verursacht wird, bevor die Workerthreads die Möglichkeit haben, zu beenden. Außerdem kann die Verwendung eines zu kurzen Werts für dwUnloadDelay zu Leistungsproblemen führen, da beim Erneutladen einer DLL mehr Aufwand entsteht, als sie ausgelagert werden zu lassen.
Dieses Verhalten wird durch die DLL ausgelöst, die Komponenten mit Threadingmodellen liefert, die auf Frei, Neutral oder Beides festgelegt sind. Für ein Threadingmodell, das auf Apartment festgelegt ist (oder wenn kein Threadingmodell angegeben ist), wird dwUnloadDelay als 0 behandelt, da diese Komponenten an den einzelnen Thread gebunden sind, der das Apartment hostet.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | combaseapi.h (include Objbase.h) |
Bibliothek | Ole32.lib |
DLL | ComBase.dll |