Compartilhar via


Distribuidores de plug-in

[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.]

Os PIDs (distribuidores de plug-in) são uma maneira de estender a funcionalidade do gerenciador de grafo de filtros. Um distribuidor de plug-in é um objeto COM que o gerenciador de grafo de filtro agrega em tempo de execução. Os aplicativos obtêm acesso ao PID por meio do gerenciador de grafo de filtro.

Quando o gerenciador de grafo de filtro é consultado para uma interface à qual não dá suporte, ele pesquisa no Registro uma chave com o seguinte formulário:

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID é uma cadeia de caracteres que contém o identificador de interface. Se a entrada do Registro existir, o valor da entrada definirá o CLSID (identificador de classe) de um PID que dá suporte à interface . O gerenciador de grafo de filtro agrega o PID e retorna um ponteiro de interface, atuando assim como o IUnknown externo para o PID. Quando o aplicativo chama métodos na interface, ele está realmente chamando-os no PID. No entanto, a existência do PID é transparente para o aplicativo.

O termo distribuidor decorre do fato de que um PID pode consultar seu ponteiro IUnknown externo para interfaces no gerenciador de grafo de filtro. Chamando o método IFilterGraph::EnumFilters , o PID pode enumerar os filtros no grafo e distribuir chamadas de método para esses filtros. Dessa forma, um PID pode servir como um único ponto de controle para o aplicativo chamar métodos em filtros.

Quando o gerenciador de grafo de filtro agrega um PID, ele consulta o PID para a interface IDistributorNotify . Se o PID der suporte a essa interface, o gerenciador de grafo de filtro a usará para notificar o PID sobre as alterações no grafo:

Para implementar um PID personalizado, crie um objeto COM que dê suporte à agregação. Ele deve dar suporte a uma interface à qual o gerenciador de grafo de filtro ainda não dá suporte. Opcionalmente, ele pode dar suporte à interface IDistributorNotify .

Se o PID obtiver ponteiros de interface do gerenciador de grafo de filtro, ele deverá liberá-los imediatamente. Caso contrário, ele pode criar uma contagem de referência circular, o que poderia impedir que o gerenciador de grafo de filtro fosse destruído. Manter uma contagem de referência no gerenciador de grafo de filtros é desnecessário em qualquer caso, porque o gerenciador de grafo de filtro controla o tempo de vida do PID.

Como um PID foi projetado especificamente para agregação pelo gerenciador de grafo de filtro, convém impor isso no método de construtor do PID. Verifique se o ponteiro IUnknown externo é NULL e, em caso afirmativo, retorne o código de erro VFW_E_NEED_OWNER. (Consulte Códigos de erro e êxito.) Além disso, para impedir que outros objetos agregem o PID, você pode consultar o ponteiro IUnknown externo para a interface IGraphBuilder . Retornará um código de erro se o objeto não expor IGraphBuilder.