Поделиться через


Создание объектов аудиодрайвов

В пользовательском режиме COM-объекты создаются с помощью функции CoCreateInstance (описанной в документации по Microsoft Windows SDK), где клиент не знает, как выделяется память, необходимая для объекта. Однако в режиме ядра, где выделение памяти, как правило, жестко контролируется, требуется другой метод создания объекта.

Модель аудиодрайдера использует концепцию COM-интерфейса, определенную интерфейсом IUnknown . Однако звуковые драйверы не требуются для доступа к реестру или использования таких механизмов, как внутрипроцессные серверы. Драйверы минипорта не требуются для поддержки агрегирования.

По соглашению функция, используемая для создания определенного класса объектов, всегда имеет одну и ту же форму:

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

Параметры

Неизвестный
Указатель на указатель на интерфейс IUnknown . Функция выводит ссылку на вновь созданный объект через Неизвестно.

Classid
Указывает GUID класса, который передается по ссылке. Этот параметр используется только в том случае, если функция создает объекты нескольких классов. В противном случае ему присваивается значение NULL.

OuterUnknown
Указывает интерфейс IUnknown для агрегирования нового объекта. Этот параметр может иметь значение NULL , чтобы указать, что агрегирование не требуется.

Тип пула
Указывает тип пула памяти, из которого будет выделен объект (см . POOL_TYPE).

Первые три параметра идентичны параметрам функции COM CoCreateInstance . Пример функции создания этого типа см. в разделе Функция CreateMiniportMidiFM в примере аудиодрайвера Fmsynth в комплекте драйверов Microsoft Windows (WDK).

Другим соглашением является предоставление функции NewXxx для класса. Такие функции предоставляют простой способ создания (создания и инициализации) объекта, как показано в следующем примере:

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

Функция NewMyObject создает и инициализирует объект , а затем передает указатель обратно в интерфейс . Так как параметры инициализации зависят от класса, это прототип функции NewXxx . Функция NewXxx обеспечивает удобный доступ к конструктору для объекта .

Пример функции NewXxx этого типа см. в разделе PcNewDmaChannel.