Compartir a través de


Carga de un grafo desde un proceso externo

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

GraphEdit puede cargar un grafo de filtro creado por un proceso externo. Con esta característica, puede ver exactamente qué gráfico de filtros compila la aplicación, con solo una cantidad mínima de código adicional en la aplicación.

Nota:

Esta característica requiere Windows 2000, Windows XP o posterior.

 

Nota:

A partir de Windows Vista, debe registrar proppage.dll para habilitar esta característica. Proppage.dll se incluye en Windows SDK.

 

La aplicación debe registrar la instancia de gráfico de filtro en la tabla de objetos en ejecución (ROT). Rot es una tabla de búsqueda accesible globalmente que realiza un seguimiento de los objetos en ejecución. Los objetos se registran en rot por moniker. Para conectarse al grafo, GraphEdit busca en ROT los monikers cuyo nombre para mostrar coincide con un formato determinado:

!FilterGraph X pid Y

donde X es la dirección hexadecimal del Administrador de gráficos de filtros y Y es el identificador de proceso, también en hexadecimal.

Cuando la aplicación cree por primera vez el grafo de filtro, llame a la siguiente función:

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 función crea un moniker y una nueva entrada ROT para el gráfico de filtros. El primer parámetro es un puntero al gráfico de filtros. El segundo parámetro recibe un valor que identifica la nueva entrada ROT. Antes de que la aplicación libere el gráfico de filtros, llame a la siguiente función para quitar la entrada ROT. El parámetro pdwRegister es el identificador devuelto por la función AddToRot.

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

En el ejemplo de código siguiente se muestra cómo llamar a estas funciones. En este ejemplo, el código que agrega y quita las entradas ROT se compila condicionalmente, de modo que solo se incluye en las compilaciones de depuración.

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 ver el gráfico de filtros en GraphEdit, ejecute la aplicación y GraphEdit al mismo tiempo. En el menú GráficoEditar archivo , haga clic en Conectar a Gráfico remoto... En el cuadro de diálogo Conectar con grafo , seleccione el identificador de proceso (pid) de la aplicación y haga clic en Aceptar. GraphEdit carga el gráfico de filtros y lo muestra. No use ninguna otra característica de GraphEdit en este grafo; podría provocar resultados inesperados. Por ejemplo, no agregue ni quite filtros, ni detenga e inicie el gráfico. Cierre GraphEdit antes de salir de la aplicación.

Nota:

La aplicación puede alcanzar varias aserciones cuando se cierra. Puede pasarlos por alto.

 

En la ilustración siguiente se muestra el cuadro de diálogo Conectarse al grafo .

conectarse al grafo

Cuando GraphEdit carga el gráfico, se ejecuta en el contexto de la aplicación de destino. Por lo tanto, GraphEdit podría bloquearse porque está esperando el subproceso. Por ejemplo, esto puede ocurrir si va a recorrer el código en el depurador.

Esta característica solo se debe usar en compilaciones de depuración de la aplicación, no compilaciones comerciales, ya que permite a otras aplicaciones ver o controlar el gráfico de filtros.

Conexión a un grafo remoto desde la línea de comandos

GraphEdit admite una opción de línea de comandos para cargar automáticamente un grafo remoto al iniciarse. La sintaxis es:

GraphEdt -a moniker

donde moniker es un moniker creado con la función AddToRot, descrita anteriormente.

Simulación de la compilación de grafos con GraphEdit