Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В пользовательском режиме COM-объекты создаются с помощью функции, такой как CoCreateInstance (описанная в документации по пакету SDK для Microsoft Windows), где клиент не знает, как выделена память, необходимая для объекта. Однако в режиме ядра, где выделение памяти, как правило, жестко контролируется, требуется другой метод создания объекта.
Модель звукового драйвера использует концепцию COM-интерфейса, как определено интерфейсом IUnknown . Однако звуковые драйверы не требуются для доступа к реестру или использования таких механизмов, как серверы внутрипроцессной обработки. Драйверы минипортов не обязаны поддерживать агрегирование.
По соглашению функция, используемая для создания определенного класса объектов, всегда принимает одну и ту же форму:
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).
Первые три параметра идентичны параметрам функции 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.