Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Nachdem WMI seine Arbeit mit einem Anbieter abgeschlossen hat, wird dieser aus dem Speicher entladen. Der Hauptgrund dafür, dass WMI einen Anbieter entlädt, besteht darin, Systemressourcen zu sparen. Daher müssen Sie Code hinzufügen, der es WMI ermöglicht, Ihren Anbieter effizient auszuschalten. Es dauert vom im Cache-Steuerelement angegebenen Intervall bis zu dem doppelten Intervall, bis WMI einen Anbieter entlädt.
WMI entlädt einen Anbieter auf eine der folgenden Arten:
- Entladen Sie einen Anbieter, nachdem der Anbieter die ihm zugewiesenen Aufgaben abgeschlossen hat.
- Entladen Sie schnell alle Anbieter, wenn der Benutzer das System heruntergefahren. Beachten Sie, dass WMI beim Beenden des WMI-Diensts über die Befehlszeile In-Prozess-Anbieter entlädt.
Während das erste Szenario häufiger ist, müssen Sie Ihren Anbieter bezüglich beider Möglichkeiten kontaktieren.
Die folgenden Abschnitte werden in diesem Thema behandelt:
- Entladen eines inaktiven Anbieters
- Zugreifen auf die Leerlaufzeit für einen Anbieter
- Entladen eines Anbieters, der ebenfalls ein WMI-Client ist
- Entladen eines Dienstanbieters während des Herunterfahrens
- Verwandte Themen
Entladen eines inaktiven Anbieters
WMI führt beim Entladen eines Leerlaufanbieters die folgenden Aktionen aus:
Bestimmt, ob der Anbieter im Leerlauf ist.
WMI verwendet die ClearAfter-Eigenschaft , um zu bestimmen, wie lange ein Anbieter im Leerlauf bleiben kann, bevor dieser Anbieter entladen wird. Weitere Informationen finden Sie unter Zugreifen auf die Leerlaufzeit für einen Anbieter.
Ruft die Release-Methode des Anbieters auf.
Wenn es sich bei dem Anbieter um einen reinen Anbieter handelt, entfernt Release den Anbieter vollständig aus dem aktiven Speicher. Ein nichtpurer Anbieter kann jedoch weiterhin ausgeführt werden, nachdem der WMI-Aufruf von Release stattgefunden hat.
Zugreifen auf die Leerlaufzeit für einen Anbieter
Die minimale Zeitspanne, die ein Anbieter aktiv bleibt, wird durch die ClearAfter-Eigenschaft bestimmt. Sie finden ClearAfter in Instanzen von Klassen, die von der WMI-Systemklasse __CacheControl im \root-Namespace abgeleitet sind.
In der folgenden Liste werden die Klassen beschrieben, die von __CacheControl abgeleitet werden, wodurch das Entladen des Anbieters gesteuert wird:
- __EventConsumerProviderCacheControl
- __EventProviderCacheControl
- __EventSinkCacheControl
- __ObjectProviderCacheControl
- __PropertyProviderCacheControl
Sie können die minimale Zeitspanne ändern, die es einem Anbieter ermöglicht, inaktiv zu bleiben, indem Sie die ClearAfter-Eigenschaft in der Cachesteuerelementinstanz für einen bestimmten Anbietertyp bearbeiten. Um beispielsweise die Zeitspanne zu begrenzen, die ein Eigenschaftsanbieter im Leerlauf bleiben kann, würden Sie die ClearAfter-Eigenschaft einer __PropertyProviderCacheControl Instanz im \root-Namespace bearbeiten.
Entladen eines Anbieters, der auch ein WMI-Client ist
Ihr Anbieter muss möglicherweise ein Client von WMI bleiben, nachdem er die Anbieterfunktionen abgeschlossen hat, die er auszuführen hat. Beispielsweise muss ein Pushanbieter möglicherweise Abfragen an WMI ausstellen. Weitere Informationen finden Sie unter Bestimmen des Push- oder Pullstatus. In diesem Fall sollte die Pure-Eigenschaft der __Win32Provider Instanz, die den Anbieter darstellt, auf TRUE festgelegt werden. Wenn die Pure-Eigenschaft auf FALSE festgelegt ist, bereitet der Anbieter das Entladen vor, indem IUnknown::Release für alle ausstehenden Schnittstellenpunkte aufgerufen wird, wenn WMI die Release-Methode der primären Schnittstelle aufruft. Weitere Informationen finden Sie im Abschnitt "Hinweise" in __Win32Provider.
Im folgenden Verfahren wird beschrieben, wie Sie eine Releasemethode für die primäre Schnittstelle Ihres Anbieters implementieren.
So entladen Sie einen Anbieter
Lassen Sie alle Schnittstellenzeiger frei, die an WMI gebunden sind, wenn WMI die Release-Methode der primären Schnittstelle Ihres Anbieters aufruft.
In der Regel enthält ein Anbieter Zeiger auf die IWbemServices- und IWbemContext-Schnittstellen, die in IWbemProviderInit::Initialize übergeben werden.
Wenn die Pure-Eigenschaft in der zugeordneten __Win32Provider Instanz auf FALSE festgelegt ist, kann der Provider nach dem Release-Aufruf in die Rolle der Clientanwendung wechseln. WMI kann jedoch keinen Anbieter entladen, der als Klientensystem arbeitet, wodurch die Systembelastung erhöht wird.
Ein Anbieter mit "Pure "-Wert auf TRUE ist nur für Serviceanfragen vorhanden. Ein Anbieter dieses Typs kann daher nicht die Rolle einer Clientanwendung übernehmen, und WMI kann ihn entladen.
Entladen eines Anbieters während des Herunterfahrens
Unter normalen Umständen ermöglicht die Verwendung der Richtlinien aus Entladen eines Anbieters, der auch ein WMI-Client ist es WMI, Ihren Anbieter ordnungsgemäß zu entladen. Sie können jedoch auf Situationen stoßen, in denen WMI die normalen Entladungsverfahren nicht einleiten kann, z. B. wenn der Benutzer entscheidet, das System herunterzufahren. Durch die Verwendung eines Transaktionsmodells der Datenspeicherung können Sie zusätzlich zur Implementierung einer guten Bereinigungsstrategie sicherstellen, dass Ihr Anbieter ordnungsgemäß entladen wird.
Der Benutzer kann WMI jederzeit beenden. In einer solchen Situation entlädt WMI keine Anbieter und ruft auch nicht den DllCanUnloadNow-Einstiegspunkt in einem beliebigen In-Process-Anbieter auf. Wenn sich ein Prozessanbieter zum Zeitpunkt des Herunterfahrens in der Mitte eines Methodenaufrufs befindet, kann WMI möglicherweise den ausgeführten Thread in der Mitte des Aufrufs beenden. In diesem Fall ruft WMI keine Routinen auf, die normalerweise die Bereinigung übernehmen, wie zum Beispiel einen Objektdestruktor. WMI ruft höchstens nur DllMain auf.
Wenn das Betriebssystem WMI herunterfährt, wird vom System automatisch der gesamte Speicher freigegeben, der einem In-Process-Anbieter zugewiesen ist. Das Betriebssystem schließt auch die meisten vom Anbieter verwalteten Ressourcen, wie z. B. Dateihandles, Fensterhandles usw. Der Anbieter muss keine spezifischen Maßnahmen ergreifen, um dies zu tun.
Da WMI in der Mitte eines Anrufs heruntergefahren werden kann, sollte ein Anbieter keine Datenquellen in einem inkonsistenten Zustand belassen. Daten in einem inkonsistenten Zustand zu belassen ist kein Problem für Anbieter mit schreibgeschütztem Zugriff. Anbieter mit Schreibfunktionen möchten jedoch möglicherweise eine Art Transaktionsmodell implementieren, um ein sicheres Rollback nach einer abrupten Beendigung zu ermöglichen.
Obwohl das Betriebssystem möglicherweise einige allgemeine Systemressourcen freigibt, gibt das System nicht automatisch alle Ressourcen frei. Das Betriebssystem kann z. B. keinen Socket oder eine Datenbankverbindung freigeben. Stattdessen muss der Anbieter diese Ressourcen möglicherweise manuell bereinigen. Um diese Probleme zu vermeiden, können Sie entweder Ihren Anbieter außerhalb des Prozesses implementieren oder Bereinigungscode hinzufügen.
Die einfachste Lösung besteht darin, Ihren Anbieter außerhalb des Prozesses zu implementieren. Ein Out-of-Process-Anbieter wird nicht beendet, wenn WMI heruntergefahren wird, obwohl WMI den Anbieter nach einem COM-Timeout freigeben wird. Anbieter, für die Robustheit bei der Bereinigung und Beendigung wichtiger ist als die Leistung, könnten außerhalb des Prozesses ausgeführt werden.
Wenn Sie Bereinigungscode in Ihrem Anbieter platzieren müssen, haben Sie zwei Optionen. Ein Ort zum Ausführen dieser Art von Bereinigung ist DllMain, die DLL-Einstiegspunktfunktion, die das Betriebssystem beim Entladen der DLL aufruft. Bereinigungscode kann direkt zu DllMain hinzugefügt werden und als Reaktion auf DLL_PROCESS_DETACH ausgeführt werden. Die Implementierung von Bereinigungscode in DllMain kann etwas schwierig sein, insbesondere in Programmierumgebungen wie MFC oder ATL. Weitere Informationen finden Sie im Microsoft Knowledge Base-Artikel Q148791: "Bereitstellen Ihrer eigenen DllMain in einer regulären MFC-DLL". (Diese Ressource ist in einigen Sprachen und Ländern oder Regionen möglicherweise nicht verfügbar.)
Alternativ können Sie den Bereinigungscode auch im Destruktor einer globalen Klasse platzieren. Für weitere Informationen siehe Entladen eines Anbieters. Das Windows-Betriebssystem weist keine globalen Objekte auf dem Heap zu. Stattdessen ruft das Betriebssystem die Destruktoren beim Entladen der DLL auf.
Es folgt eine einfache Bereinigungsprozedur, die in ein globales Objekt für WMI passen könnte.
class CMyCleanup
{
~CMyCleanup()
{
CloseHandle(m_hOpenFile);
CloseDatabaseConnection(g_hDatabase);
}
} g_Cleanup;
Es gibt viele Einschränkungen, was im Bereinigungscode bei beiden Ansätzen getan werden kann. So können beispielsweise weder Threads noch DLLs, die nicht implizit verknüpft sind, auf irgendeine Weise zugegriffen werden. Darüber hinaus können Sie unter keinen Umständen COM-Anrufe tätigen.
Zugehörige Themen