Dela via


Skapa ljuddrivrutinsobjekt

I användarläge skapas COM-objekt med hjälp av en funktion som CoCreateInstance (beskrivs i Microsoft Windows SDK-dokumentationen), där klienten inte vet hur det minne som krävs för objektet allokeras. I kernelläge, där allokeringen av minne tenderar att vara strikt kontrollerad, krävs dock en annan metod för att skapa objekt.

Ljuddrivrutinsmodellen använder begreppet COM-gränssnitt enligt definitionen i IUnknown-gränssnittet . Ljuddrivrutiner krävs dock inte för att komma åt registret eller för att använda mekanismer som processerver. Miniportdrivrutiner krävs inte för aggregering.

Enligt konvention har den funktion som används för att skapa en viss klass av objekt alltid samma form:

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

Parametrar

Okänd
Pekare till en pekare för ett IUnknown-gränssnitt. Funktionen matar ut en referens till det nyligen skapade objektet via Okänd.

ClassId
Anger klassens GUID, som skickas med referens. Den här parametern används endast om funktionen skapar objekt av flera klasser. Annars är den inställd på NULL.

OuterUnknown
Anger IUnknown-gränssnittet för att aggregera det nya objektet. Den här parametern kan anges till NULL för att indikera att ingen aggregering krävs.

PoolType
Anger vilken typ av minnespool som objektet ska allokeras från (se POOL_TYPE).

De första tre parametrarna är identiska med parametrarna för funktionen COM CoCreateInstance . Ett exempel på en skapandefunktion av den här typen finns i funktionen CreateMiniportMidiFM i fmsynth-exempelljuddrivrutinen i Microsoft Windows Driver Kit (WDK).

En annan konvention är att tillhandahålla en nyXxx-funktion för en klass. Sådana funktioner är ett enkelt sätt att instansiera (skapa och initiera) ett objekt, som du ser i följande exempel:

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

Funktionen NewMyObject skapar och initierar ett objekt och skickar sedan en pekare tillbaka till gränssnittet. Eftersom initieringsparametrarna är specifika för klassen, är även prototypen för en nyXxx-funktion det. Funktionen NewXxx ger bekväm åtkomst till konstruktorn för objektet.

Ett exempel på en nyXxx-funktion av den här typen finns i PcNewDmaChannel.