Udostępnij przez


Ładowanie grafu z procesu zewnętrznego

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

GraphEdit może załadować wykres filtru utworzony przez proces zewnętrzny. Dzięki tej funkcji możesz zobaczyć dokładnie, jaki wykres filtru kompiluje aplikacja, z minimalną ilością dodatkowego kodu w aplikacji.

Notatka

Ta funkcja wymaga systemu Windows 2000, Windows XP lub nowszego.

 

Notatka

Począwszy od systemu Windows Vista, należy zarejestrować proppage.dll, aby włączyć tę funkcję. Proppage.dll jest dołączony do zestawu Windows SDK.

 

Aplikacja musi zarejestrować wystąpienie grafu filtru w tabeli Running Object Table (ROT). Rot to globalnie dostępna tabela odnośników, która śledzi uruchomione obiekty. Obiekty są rejestrowane w ROT za pomocą nazwy. Aby nawiązać połączenie z grafem, GraphEdit przeszukuje ROT w poszukiwaniu monikerów, których nazwa wyświetlana jest zgodna z określonym formatem.

!FilterGraph X pid Y

gdzie X jest adresem szesnastkowym Menedżera grafów filtrów, a Y jest identyfikatorem procesu, również w szesnastkowym.

Gdy aplikacja najpierw utworzy wykres filtru, wywołaj następującą funkcję:

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

Ta funkcja tworzy pseudonim i nowy wpis ROT dla wykresu filtru. Pierwszy parametr jest wskaźnikiem do wykresu filtru. Drugi parametr otrzymuje wartość identyfikującą nowy wpis ROT. Zanim aplikacja zwolni wykres filtru, wywołaj następującą funkcję, aby usunąć wpis ROT. Parametr pdwRegister jest identyfikatorem zwróconym przez funkcję AddToRot.

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

Poniższy przykład kodu przedstawia sposób wywoływania tych funkcji. W tym przykładzie kod, który dodaje i usuwa wpisy ROT, jest kompilowany warunkowo, dzięki czemu jest uwzględniany tylko w kompilacjach debugowania.

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

Aby wyświetlić wykres filtru w narzędziu GraphEdit, uruchom aplikację i narzędzie GraphEdit w tym samym czasie. W menu GraphEdit File kliknij Connect to Remote Graph... W oknie dialogowym Connect To Graph wybierz identyfikator procesu (pid) aplikacji i kliknij przycisk OK. GraphEdit ładuje wykres filtru i wyświetla go. Nie używaj żadnych innych funkcji GraphEdit na tym wykresie — może to spowodować nieoczekiwane wyniki. Na przykład nie dodawaj ani nie usuwaj filtrów ani nie zatrzymywaj i nie uruchamiaj grafu. Zamknij narzędzie GraphEdit przed zamknięciem aplikacji.

Notatka

Twoja aplikacja może napotkać różne asercje, gdy kończy działanie. Można je zignorować.

 

Na poniższej ilustracji przedstawiono okno dialogowe Connect To Graph.

połącz się z grafem

Gdy GraphEdit ładuje graf, działa w kontekście aplikacji docelowej. W związku z tym narzędzie GraphEdit może zostać zablokowane, gdyż czeka na wątek. Na przykład może to wystąpić, jeśli przeglądasz swój kod w debugerze.

Ta funkcja powinna być używana tylko w kompilacjach debugowania aplikacji, a nie kompilacjach detalicznych, ponieważ umożliwia innym aplikacjom wyświetlanie lub kontrolowanie grafu filtru.

Nawiązywanie połączenia z grafem zdalnym z wiersza polecenia

Narzędzie GraphEdit obsługuje opcję wiersza polecenia, aby automatycznie załadować zdalny graf podczas uruchamiania. Składnia to:

GraphEdt -a moniker

gdzie moniker to moniker utworzony przy użyciu funkcji AddToRot, opisanej wcześniej.

symulowanie kompilacji grafu za pomocą narzędzia GraphEdit