Partilhar via


Criando objetos de driver de áudio

No modo de usuário, os objetos COM são criados usando uma função como CoCreateInstance (descrita na documentação do SDK do Microsoft Windows), em que o cliente não sabe como a memória necessária para o objeto é alocada. No modo kernel, no entanto, em que a alocação de memória tende a ser fortemente controlada, um método diferente de criação de objeto é necessário.

O modelo de driver de áudio usa o conceito da interface COM, conforme definido pela interface IUnknown . Os drivers de áudio, no entanto, não são necessários para acessar o registro ou usar mecanismos como servidores em processo. Drivers de miniporta não são necessários para dar suporte à agregação.

Por convenção, a função usada para criar uma classe específica de objetos sempre assume a mesma forma:

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

Parâmetros

Desconhecido
Ponteiro para um ponteiro para uma interface IUnknown . A função gera uma referência ao objeto recém-criado por meio de Unknown.

Classid
Especifica o GUID de classe, que é passado por referência. Esse parâmetro será usado somente se a função criar objetos de várias classes. Caso contrário, ele será definido como NULL.

OuterUnknown
Especifica a interface IUnknown para agregar o novo objeto. Esse parâmetro pode ser definido como NULL para indicar que nenhuma agregação é necessária.

PoolType
Especifica o tipo de pool de memória do qual o objeto deve ser alocado (consulte POOL_TYPE).

Os três primeiros parâmetros são idênticos aos parâmetros da função COCreateInstance COM. Para obter um exemplo de uma função de criação desse tipo, consulte a função CreateMiniportMidiFM no driver de áudio de exemplo Fmsynth no WDK (Microsoft Windows Driver Kit).

Outra convenção é fornecer uma nova funçãoXxx para uma classe. Essas funções fornecem uma maneira fácil de instanciar (criar e inicializar) um objeto, conforme mostrado no exemplo a seguir:

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

A função NewMyObject cria e inicializa um objeto e, em seguida, passa um ponteiro de volta para a interface. Como os parâmetros de inicialização são específicos da classe, o protótipo de uma função NewXxx também é. A função NewXxx fornece acesso conveniente ao construtor para o objeto .

Para obter um exemplo de uma função NewXxx desse tipo, consulte PcNewDmaChannel.