Condividi tramite


Caricamento di un grafico da un processo esterno

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione di audio e video nella Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di utilizzare nuovi codici MediaPlayer, IMFMediaEngine e Acquisizione audio/video 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 del filtro compilato dall'applicazione, con solo una quantità minima di codice aggiuntivo nell'applicazione.

Nota

Questa funzionalità richiede Windows 2000, Windows XP o versione successiva.

 

Nota

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

 

L'applicazione deve registrare l'istanza del grafo del filtro nella Tabella degli Oggetti in Esecuzione (ROT). Rot è una tabella di ricerca accessibile a livello globale che tiene traccia degli oggetti in esecuzione. Gli oggetti vengono registrati nel ROT tramite moniker. Per connettersi al grafico, GraphEdit cerca nella Tabella degli Oggetti Correnti (ROT) 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 in esadecimale.

Quando l'applicazione crea per la prima volta 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 di 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 venga 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 File di GraphEdit , fare clic su Connetti al grafico remoto... Nella finestra di dialogo Connetti al grafico , 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à di GraphEdit in questo grafico. Potrebbe causare risultati imprevisti. Ad esempio, non aggiungere o rimuovere filtri, né fermare e avviare nuovamente il grafico. Chiudere GraphEdit prima di uscire dall'applicazione.

Nota

L'applicazione potrebbe generare vari errori di asserzione quando viene chiusa. È possibile ignorare questi elementi.

 

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

connetti a grafico

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

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

Connessione a un grafo remoto dalla riga di comando

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

GraphEdt -a moniker

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

Simulazione della costruzione di grafi con GraphEdit