Creazione di oggetti driver audio

In modalità utente, gli oggetti COM vengono creati usando una funzione come CoCreateInstance (descritta nella documentazione di Microsoft Windows SDK), in cui il client non è a conoscenza della modalità di allocazione della memoria necessaria per l'oggetto. In modalità kernel, tuttavia, dove l'allocazione della memoria tende a essere strettamente controllata, è necessario un metodo diverso per la creazione di oggetti.

Il modello di driver audio usa il concetto dell'interfaccia COM, come definito dall'interfaccia IUnknown . I driver audio, tuttavia, non sono necessari per accedere al Registro di sistema o per usare meccanismi come i server in-process. I driver miniport non sono necessari per supportare l'aggregazione.

Per convenzione, la funzione usata per creare una determinata classe di oggetti accetta sempre la stessa forma:

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

Parametri

Sconosciuto
Puntatore a un puntatore a un'interfaccia IUnknown . La funzione restituisce un riferimento all'oggetto appena creato tramite Unknown.

Classid
Specifica il GUID della classe, passato per riferimento. Questo parametro viene usato solo se la funzione crea oggetti di più classi. In caso contrario, è impostato su NULL.

OuterUnknown
Specifica l'interfaccia IUnknown per aggregare il nuovo oggetto. Questo parametro può essere impostato su NULL per indicare che non è necessaria alcuna aggregazione.

PoolType
Specifica il tipo di pool di memoria da cui deve essere allocato l'oggetto (vedere POOL_TYPE).

I primi tre parametri sono identici ai parametri della funzione COM CoCreateInstance . Per un esempio di funzione di creazione di questo tipo, vedere la funzione CreateMiniportMidiFM nel driver audio di esempio Fmsynth in Microsoft Windows Driver Kit (WDK).

Un'altra convenzione consiste nell'fornire una funzione NewXxx per una classe. Queste funzioni offrono un modo semplice per creare un'istanza (creare e inizializzare) un oggetto, come illustrato nell'esempio seguente:

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

La funzione NewMyObject crea e inizializza un oggetto e quindi passa un puntatore all'interfaccia. Poiché i parametri di inizializzazione sono specifici della classe, è quindi il prototipo di una nuova funzioneXxx . La funzione NewXxx consente di accedere facilmente al costruttore per l'oggetto.

Per un esempio di nuova funzioneXxx di questo tipo, vedere PcNewDmaChannel.