Partilhar via


Carregando um gráfico a partir de um processo externo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no 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.]

GraphEdit pode carregar um gráfico de filtro criado por um processo externo. Com esse recurso, você pode ver exatamente qual gráfico de filtro seu aplicativo cria, com apenas uma quantidade mínima de código adicional em seu aplicativo.

Observação

Esta funcionalidade requer o Windows 2000, Windows XP ou posterior.

 

Observação

A partir do Windows Vista, você deve registrar proppage.dll para habilitar esse recurso. Proppage.dll está incluído no SDK do Windows.

 

O aplicativo deve registrar a instância do gráfico de filtro na tabela de objetos em execução (ROT). O ROT é uma tabela de consulta acessível globalmente que acompanha os objetos em execução. Os objetos são registrados no ROT pelo apelido. Para se conectar ao gráfico, o GraphEdit procura no ROT por apelidos cujo nome de exibição corresponda a um formato específico:

!FilterGraph X pid Y

onde X é o endereço hexadecimal do Filter Graph Manager e Y é a id do processo, também em hexadecimal.

Quando seu aplicativo criar o gráfico de filtro pela primeira vez, chame a seguinte função:

HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
    IMoniker * pMoniker = NULL;
    IRunningObjectTable *pROT = NULL;

    if (FAILED(GetRunningObjectTable(0, &pROT))) 
    {
        return E_FAIL;
    }
    
    const size_t STRING_LENGTH = 256;

    WCHAR wsz[STRING_LENGTH];
 
   StringCchPrintfW(
        wsz, STRING_LENGTH, 
        L"FilterGraph %08x pid %08x", 
        (DWORD_PTR)pUnkGraph, 
        GetCurrentProcessId()
        );
    
    HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr)) 
    {
        hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, pUnkGraph,
            pMoniker, pdwRegister);
        pMoniker->Release();
    }
    pROT->Release();
    
    return hr;
}

Esta função cria um moniker e uma nova entrada ROT para o gráfico de filtro. O primeiro parâmetro é um ponteiro para o gráfico de filtro. O segundo parâmetro recebe um valor que identifica a nova entrada ROT. Antes que o aplicativo libere o gráfico de filtro, chame a seguinte função para remover a entrada ROT. O parâmetro pdwRegister é o identificador retornado pela função AddToRot.

void RemoveFromRot(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;
    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

O exemplo de código a seguir mostra como chamar essas funções. Neste exemplo, o código que adiciona e remove entradas ROT é compilado condicionalmente, para que seja incluído apenas em compilações de depuração.

IGraphBuilder *pGraph;
DWORD dwRegister;
    
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// Rest of the application (not shown).

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

Para visualizar o gráfico de filtro no GraphEdit, execute seu aplicativo e o GraphEdit ao mesmo tempo. No menu GraphEdit File, clique em Conectar ao Remote Graph... Na caixa de diálogo Conectar ao Graph, selecione a ID do processo (pid) do seu aplicativo e clique em OK. O GraphEdit carrega o gráfico de filtro e o exibe. Não use nenhum outro recurso do GraphEdit neste gráfico — isso pode causar resultados inesperados. Por exemplo, não adicione ou remova filtros, nem pare e inicie o gráfico. Feche o GraphEdit antes de sair do aplicativo.

Observação

A sua aplicação pode encontrar várias asserções quando for encerrada. Você pode ignorá-los.

 

A ilustração seguinte mostra a caixa de diálogo Conectar ao Gráfico.

conectar-se ao gráfico

Quando o GraphEdit carrega o gráfico, ele é executado no contexto do aplicativo de destino. Portanto, GraphEdit pode bloquear porque está aguardando o thread. Por exemplo, isso pode ocorrer se estiveres a analisar o teu código no depurador.

Esse recurso deve ser usado apenas em compilações de depuração do seu aplicativo, não em compilações de varejo, porque ele permite que outros aplicativos visualizem ou controlem o gráfico de filtro.

Conectando-se a um gráfico remoto a partir da linha de comando

O GraphEdit suporta uma opção de linha de comando para carregar um gráfico remoto automaticamente na inicialização. A sintaxe é:

GraphEdt -a moniker

onde moniker é um moniker criado usando a função AddToRot, descrita anteriormente.

Simulando a construção de gráficos com o GraphEdit