Freigeben über


Erstellen von Audiotreiberobjekten

Im Benutzermodus werden COM-Objekte mithilfe einer Funktion wie CoCreateInstance (beschrieben in der Microsoft Windows SDK-Dokumentation) erstellt, bei der der Client nicht weiß, wie der für das Objekt erforderliche Arbeitsspeicher zugeordnet wird. Im Kernelmodus, in dem die Speicherbelegung tendenziell streng kontrolliert wird, ist jedoch eine andere Methode der Objekterstellung erforderlich.

Das Audiotreibermodell verwendet das Konzept der COM-Schnittstelle, wie von der IUnknown-Schnittstelle definiert. Audiotreiber sind jedoch nicht erforderlich, um auf die Registrierung zuzugreifen oder Mechanismen wie prozessinterne Server zu verwenden. Miniporttreiber sind nicht erforderlich, um aggregation zu unterstützen.

Gemäß der Konvention hat die Funktion, die zum Erstellen einer bestimmten Klasse von Objekten verwendet wird, immer die gleiche Form:

NTSTATUS CreateMyObject(
   OUT PUNKNOWN  *Unknown,
   IN REFGUID ClassId,
   IN PUNKNOWN OuterUnknown OPTIONAL,
   IN POOL_TYPE PoolType
 );

Parameter

Unbekannt
Zeiger auf einen Zeiger auf eine IUnknown-Schnittstelle . Die Funktion gibt einen Verweis auf das neu erstellte Objekt über Unknown aus.

Classid
Gibt die Klassen-GUID an, die als Verweis übergeben wird. Dieser Parameter wird nur verwendet, wenn die Funktion Objekte mehrerer Klassen erstellt. Andernfalls wird sie auf NULL festgelegt.

OuterUnknown
Gibt die IUnknown-Schnittstelle zum Aggregieren des neuen Objekts an. Dieser Parameter kann auf NULL festgelegt werden, um anzugeben, dass keine Aggregation erforderlich ist.

PoolType
Gibt den Typ des Speicherpools an, aus dem das Objekt zugeordnet werden soll (siehe POOL_TYPE).

Die ersten drei Parameter sind mit den Parametern der COM CoCreateInstance-Funktion identisch. Ein Beispiel für eine Erstellungsfunktion dieses Typs finden Sie unter der CreateMiniportMidiFM-Funktion im Fmsynth-Beispiel-Audiotreiber im Microsoft Windows Driver Kit (WDK).

Eine weitere Konvention besteht darin, eine neueXxx-Funktion für eine Klasse anzugeben. Solche Funktionen bieten eine einfache Möglichkeit zum Instanziieren (Erstellen und Initialisieren) eines Objekts, wie im folgenden Beispiel gezeigt:

NTSTATUS NewMyObject(
 OUT PMYINTERFACE  *InterfacePointer,
 IN PUNKNOWN  OuterUnknown OPTIONAL,
 IN POOL_TYPE  PoolType,
  // ...more parameters
 );

Die NewMyObject-Funktion erstellt und initialisiert ein -Objekt und übergibt dann einen Zeiger zurück an die Schnittstelle. Da die Initialisierungsparameter klassenspezifisch sind, ist dies auch der Prototyp einer neuenXxx-Funktion . Die NeueXxx-Funktion bietet bequemen Zugriff auf den Konstruktor für das -Objekt.

Ein Beispiel für eine neueXxx-Funktion dieses Typs finden Sie unter PcNewDmaChannel.