オーディオ ドライバー オブジェクトの作成
ユーザー モードでは、COM オブジェクトは CoCreateInstance (Microsoft Windows SDK ドキュメントで説明) などの関数を使用して作成されます。この関数では、オブジェクトに必要なメモリの割り当て方法がクライアントで認識されません。 一方、メモリの割り当てが厳密に制御される傾向があるカーネル モードでは、別のオブジェクト作成方法が必要です。
オーディオ ドライバー モデルは、IUnknown インターフェイスで定義されている COM インターフェイスの概念を使用します。 ただし、オーディオ ドライバーは、レジストリにアクセスしたり、インプロセス サーバーなどのメカニズムを使用したりする必要はありません。 ミニポート ドライバは、集約をサポートする必要はありません。
慣例により、オブジェクトの特定のクラスを作成するために使用される関数は、常に同じ形式をとります。
NTSTATUS CreateMyObject(
OUT PUNKNOWN *Unknown,
IN REFGUID ClassId,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType
);
パラメーター
不明
IUnknown インターフェイスへのポインターへのポインター。 この関数は、Unknown を使用して新しく作成されたオブジェクトへの参照を出力します。
ClassId
参照渡しされるクラス GUID を指定します。 このパラメーターは、関数が複数のクラスのオブジェクトを作成する場合にのみ使用されます。 それ以外の場合は、NULL に設定されます。
OuterUnknown
新しいオブジェクトを集約するための IUnknown インターフェイスを指定します。 このパラメーターを NULL に設定すると、集約が不要であることを示すことができます。
PoolType
オブジェクトの割り当て元となるメモリ プールの種類を指定します (「POOL_TYPE」を参照)。
最初の 3 つのパラメーターは、COM CoCreateInstance 関数のパラメーターと同じです。 この種類の作成関数の例については、Microsoft Windows Driver Kit (WDK) の Fmsynth サンプル オーディオ ドライバーの CreateMiniportMidiFM 関数を参照してください。
もう 1 つの規則は、クラスに NewXxx 関数を指定することです。 このような関数は、次の例に示すように、オブジェクトをインスタンス化 (作成および初期化) する簡単な方法を提供します。
NTSTATUS NewMyObject(
OUT PMYINTERFACE *InterfacePointer,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
// ...more parameters
);
NewMyObject 関数は、オブジェクトを作成して初期化し、ポインターをインターフェイスに戻します。 初期化パラメーターはクラス固有であるため、NewXxx 関数のプロトタイプも同様です。 NewXxx 関数を使用すると、オブジェクトのコンストラクターに簡単にアクセスできるようになります。
この型の NewXxx 関数の例については、「PcNewDmaChannel」を参照してください。