Creación de objetos de controlador de audio
En el modo de usuario, los objetos COM se crean mediante una función como CoCreateInstance (descrita en la documentación de Microsoft Windows SDK), donde el cliente no sabe cómo se asigna la memoria necesaria para el objeto. Sin embargo, en el modo kernel, cuando la asignación de memoria tiende a controlarse estrechamente, es necesario un método diferente de creación de objetos.
El modelo de controlador de audio usa el concepto de la interfaz COM, tal como se define en la interfaz IUnknown . Sin embargo, los controladores de audio no son necesarios para acceder al Registro ni para usar mecanismos como servidores en proceso. Los controladores miniport no son necesarios para admitir la agregación.
Por convención, la función utilizada para crear una clase determinada de objetos siempre tiene la misma forma:
NTSTATUS CreateMyObject(
OUT PUNKNOWN *Unknown,
IN REFGUID ClassId,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType
);
Desconocido
Puntero a un puntero a una interfaz IUnknown . La función genera una referencia al objeto recién creado a través de Unknown.
Classid
Especifica el GUID de clase, que se pasa por referencia. Este parámetro solo se usa si la función crea objetos de varias clases. De lo contrario, se establece en NULL.
OuterUnknown
Especifica la interfaz IUnknown para agregar el nuevo objeto. Este parámetro se puede establecer en NULL para indicar que no se requiere ninguna agregación.
PoolType
Especifica el tipo de grupo de memoria desde el que se va a asignar el objeto (vea POOL_TYPE).
Los tres primeros parámetros son idénticos a los parámetros de la función COM CoCreateInstance . Para obtener un ejemplo de una función de creación de este tipo, vea la función CreateMiniportMidiFM en el controlador de audio de ejemplo Fmsynth en el Kit de controladores de Microsoft Windows (WDK).
Otra convención consiste en proporcionar una función NewXxx para una clase. Estas funciones proporcionan una manera sencilla de crear e inicializar un objeto, como se muestra en el ejemplo siguiente:
NTSTATUS NewMyObject(
OUT PMYINTERFACE *InterfacePointer,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
// ...more parameters
);
La función NewMyObject crea e inicializa un objeto y, a continuación, vuelve a pasar un puntero a la interfaz. Dado que los parámetros de inicialización son específicos de la clase, es el prototipo de una función NewXxx . La función NewXxx proporciona acceso práctico al constructor para el objeto .
Para obtener un ejemplo de una función NewXxx de este tipo, vea PcNewDmaChannel.