Freigeben über


Laden eines Graphen aus einem externen Prozess

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

GraphEdit kann ein Filterdiagramm laden, das von einem externen Prozess erstellt wurde. Mit diesem Feature können Sie genau sehen, welches Filterdiagramm Ihre Anwendung erstellt, wobei nur eine minimale Menge an zusätzlichem Code in Ihrer Anwendung enthalten ist.

Hinweis

Dieses Feature erfordert Windows 2000, Windows XP oder höher.

 

Hinweis

Ab Windows Vista müssen Sie proppage.dll registrieren, um dieses Feature zu aktivieren. Proppage.dll ist im Windows SDK enthalten.

 

Die Anwendung muss das Filterdiagramm instance in der Running Object Table (ROT) registrieren. Rot ist eine global zugängliche Nachschlagetabelle, die ausgeführte Objekte nachverfolgt. Objekte werden in der ROT-Datei durch Moniker registriert. Um eine Verbindung mit dem Diagramm herzustellen, durchsucht GraphEdit die ROT-Datei nach Monikern, deren Anzeigename mit einem bestimmten Format übereinstimmt:

!FilterGraph X pid Y

Dabei ist X die hexadezimale Adresse des Filtergraph-Managers und Y die Prozess-ID, ebenfalls im Hexadezimalformat.

Wenn Ihre Anwendung das Filterdiagramm zum ersten Mal erstellt, rufen Sie die folgende Funktion auf:

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

Diese Funktion erstellt einen Moniker und einen neuen ROT-Eintrag für das Filterdiagramm. Der erste Parameter ist ein Zeiger auf das Filterdiagramm. Der zweite Parameter empfängt einen Wert, der den neuen ROT-Eintrag identifiziert. Bevor die Anwendung das Filterdiagramm freigibt, rufen Sie die folgende Funktion auf, um den ROT-Eintrag zu entfernen. Der pdwRegister-Parameter ist der bezeichner, der von der AddToRot-Funktion zurückgegeben wird.

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

Im folgenden Codebeispiel wird gezeigt, wie diese Funktionen aufgerufen werden. In diesem Beispiel wird der Code, der ROT-Einträge hinzufügt und entfernt, bedingt kompiliert, sodass er nur in Debugbuilds enthalten ist.

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

Um das Filterdiagramm in GraphEdit anzuzeigen, führen Sie Ihre Anwendung und GraphEdit gleichzeitig aus. Klicken Sie im Menü GraphEdit File (Datei ) auf Connect to Remote Graph... (Mit Remotegraph verbinden... Wählen Sie im Dialogfeld Mit Graph verbinden die Prozess-ID (pid) Ihrer Anwendung aus, und klicken Sie auf OK. GraphEdit lädt das Filterdiagramm und zeigt es an. Verwenden Sie in diesem Graph keine anderen GraphEdit-Features. Dies kann zu unerwarteten Ergebnissen führen. Fügen Sie beispielsweise keine Filter hinzu, entfernen Sie sie nicht, und beenden und starten Sie den Graphen nicht. Schließen Sie GraphEdit, bevor Sie Ihre Anwendung beenden.

Hinweis

Ihre Anwendung kann verschiedene Assertionen treffen, wenn sie beendet wird. Sie können diese Fehler ignorieren.

 

Die folgende Abbildung zeigt das Dialogfeld Mit Graph verbinden .

Herstellen einer Verbindung mit einem Diagramm

Wenn GraphEdit das Diagramm lädt, wird es im Kontext der Zielanwendung ausgeführt. Daher kann GraphEdit blockiert werden, weil es auf den Thread wartet. Dies kann beispielsweise der Fall sein, wenn Sie den Code im Debugger schrittweise durchlaufen.

Dieses Feature sollte nur in Debugbuilds Ihrer Anwendung und nicht in Verkaufsbuilds verwendet werden, da es anderen Anwendungen das Anzeigen oder Steuern des Filterdiagramms ermöglicht.

Herstellen einer Verbindung mit einem Remotegraphen über die Befehlszeile

GraphEdit unterstützt eine Befehlszeilenoption zum automatischen Laden eines Remotegraphen beim Start. Die Syntax ist:

GraphEdt -a moniker

Dabei ist moniker ein Moniker, der mit der addToRot-Funktion erstellt wurde, die zuvor beschrieben wurde.

Simulieren der Grapherstellung mit GraphEdit