Partilhar via


Fábricas de classes e modelos de fábrica

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Este tópico descreve como implementar uma DLL para um filtro DirectShow usando as Classes Base do DirectShow.

Antes que um cliente crie uma instância de um objeto COM, ele cria uma instância da fábrica de classes do objeto, usando uma chamada para a função CoGetClassObject . Em seguida, o cliente chama o método IClassFactory::CreateInstance da fábrica de classes. É a fábrica de classes que realmente cria o componente e retorna um ponteiro para a interface solicitada. (A função CoCreateInstance combina essas etapas, dentro da chamada de função.)

A ilustração a seguir mostra a sequência de chamadas de método.

chamadas de método para criar uma fábrica de classes

CoGetClassObject chama a função DllGetClassObject , que é definida na DLL. Essa função cria a fábrica de classes e retorna um ponteiro para uma interface na fábrica de classes. O DirectShow implementa DllGetClassObject para você, mas a função depende do código de uma maneira específica. Para entender como ele funciona, você deve entender como o DirectShow implementa fábricas de classes.

Uma fábrica de classes é um objeto COM dedicado à criação de outro objeto COM. Cada fábrica de classes tem um tipo de objeto que cria. No DirectShow, cada fábrica de classes é uma instância da mesma classe C++, CClassFactory. As fábricas de classes são especializadas por meio de outra classe, CFactoryTemplate, também chamada de modelo de fábrica. Cada fábrica de classes contém um ponteiro para um modelo de fábrica. O modelo de fábrica contém informações sobre um componente específico, como o CLSID (identificador de classe) do componente, e um ponteiro para uma função que cria o componente.

A DLL declara uma matriz global de modelos de fábrica, uma para cada componente na DLL. Quando DllGetClassObject faz uma nova fábrica de classes, ele pesquisa na matriz um modelo com um CLSID correspondente. Supondo que encontre um, ele cria uma fábrica de classes que contém um ponteiro para o modelo correspondente. Quando o cliente chama IClassFactory::CreateInstance, a fábrica de classes chama a função de instanciação definida no modelo.

A ilustração a seguir mostra a sequência de chamadas de método.

modelos de fábrica de classes em uma dll

O benefício dessa arquitetura é que você pode definir apenas algumas coisas específicas para seu componente, como a função de instanciação, sem implementar toda a fábrica de classes.

Como criar uma DLL de filtro do DirectShow