Condividi tramite


Caricamento di un grafico da un processo esterno

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

GraphEdit può caricare un grafico di filtro creato da un processo esterno. Con questa funzionalità è possibile visualizzare esattamente il grafico dei filtri che l'applicazione compila, con solo una quantità minima di codice aggiuntivo nell'applicazione.

Nota

Questa funzionalità richiede Windows 2000, Windows XP o versioni successive.

 

Nota

A partire da Windows Vista, è necessario registrare proppage.dll per abilitare questa funzionalità. Proppage.dll è incluso in Windows SDK.

 

L'applicazione deve registrare l'istanza del grafico del filtro nella tabella oggetto in esecuzione (ROT). Rot è una tabella di ricerca accessibile a livello globale che tiene traccia degli oggetti in esecuzione. Gli oggetti vengono registrati nel moniker ROT. Per connettersi al grafico, GraphEdit cerca il rot per i moniker il cui nome visualizzato corrisponde a un formato specifico:

!FilterGraph X pid Y

dove X è l'indirizzo esadecimale di Filter Graph Manager e Y è l'ID processo, anche nell'esadecimale.

Quando l'applicazione crea prima il grafico del filtro, chiamare la funzione seguente:

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;
}

Questa funzione crea un moniker e una nuova voce ROT per il grafico del filtro. Il primo parametro è un puntatore al grafico del filtro. Il secondo parametro riceve un valore che identifica la nuova voce ROT. Prima che l'applicazione rilasci il grafico del filtro, chiamare la funzione seguente per rimuovere la voce ROT. Il parametro pdwRegister è l'identificatore restituito dalla funzione AddToRot.

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

Nell'esempio di codice seguente viene illustrato come chiamare queste funzioni. In questo esempio il codice che aggiunge e rimuove le voci ROT viene compilato in modo condizionale, in modo che sia incluso solo nelle compilazioni di debug.

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();

Per visualizzare il grafico del filtro in GraphEdit, eseguire l'applicazione e GraphEdit contemporaneamente. Nel menu GraphEdit File fare clic su Connetti a Grafico remoto... Nella finestra di dialogo Connetti a Graph selezionare l'ID processo (pid) dell'applicazione e fare clic su OK. GraphEdit carica il grafico del filtro e lo visualizza. Non usare altre funzionalità graphEdit in questo grafico, potrebbe causare risultati imprevisti. Ad esempio, non aggiungere o rimuovere filtri o arrestare e avviare il grafico. Chiudere GraphEdit prima di uscire dall'applicazione.

Nota

L'applicazione potrebbe colpire varie asserzioni quando si chiude. che possono essere tuttavia ignorati.

 

La figura seguente mostra la finestra di dialogo Connetti a graph .

connettersi al grafico

Quando GraphEdit carica il grafico, viene eseguito nel contesto dell'applicazione di destinazione. GraphEdit potrebbe quindi bloccare perché è in attesa del thread. Ad esempio, questo può verificarsi se si esegue l'esecuzione del codice nel debugger.

Questa funzionalità deve essere usata solo nelle build di debug dell'applicazione, non nelle compilazioni al dettaglio, perché consente ad altre applicazioni di visualizzare o controllare il grafico del filtro.

Connessione a un grafo remoto dalla riga di comando

GraphEdit supporta un'opzione della riga di comando per caricare automaticamente un grafico remoto all'avvio. La sintassi è:

GraphEdt -a moniker

dove moniker è un moniker creato usando la funzione AddToRot, descritta in precedenza.

Simulazione della compilazione di graph con GraphEdit