Läsa in ett diagram från en extern process
[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]
GraphEdit kan läsa in ett filterdiagram som skapats av en extern process. Med den här funktionen kan du se exakt vilket filterdiagram som ditt program bygger, med bara en minimal mängd ytterligare kod i ditt program.
Not
Den här funktionen kräver Windows 2000, Windows XP eller senare.
Notera
Från och med Windows Vista måste du registrera proppage.dll för att aktivera den här funktionen. Proppage.dll ingår i Windows SDK.
Programmet måste registrera filterdiagraminstansen i rot-tabellen (Running Object Table). ROT är en globalt tillgänglig uppslagstabell som håller reda på objekt som körs. Objekt registreras i ROT av moniker. För att ansluta till grafen söker GraphEdit i ROT efter monikers vars visningsnamn matchar ett visst format:
!FilterGraph X pid Y
där X är hexadecimal adress för Filter Graph Manager, och Y är process-ID, även i hexadecimal.
När ditt program först skapar filterdiagrammet anropar du följande funktion:
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;
}
Den här funktionen skapar en moniker och en ny ROT-post för filterdiagrammet. Den första parametern är en pekare till filterdiagrammet. Den andra parametern tar emot ett värde som identifierar den nya ROT-posten. Innan programmet släpper filterdiagrammet anropar du följande funktion för att ta bort ROT-posten. Parametern pdwRegister är identifieraren som returneras av funktionen AddToRot.
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
I följande kodexempel visas hur du anropar dessa funktioner. I det här exemplet kompileras den kod som lägger till och tar bort ROT-poster villkorligt, så att den endast ingår i felsökningsversioner.
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();
Om du vill visa filterdiagrammet i GraphEdit kör du programmet och GraphEdit samtidigt. I menyn GraphEdit File klickar du på Connect to Remote Graph... I dialogrutan Connect To Graph väljer du programmets process-ID (pid) och klickar på OK. GraphEdit läser in filterdiagrammet och visar det. Använd inte andra GraphEdit-funktioner i den här grafen– det kan orsaka oväntade resultat. Lägg till exempel inte till eller ta bort filter, eller stoppa och starta grafen. Stäng GraphEdit innan du avslutar programmet.
Anmärkning
Ditt program kan träffa på olika assertioner när det avslutas. Du kan ignorera dessa.
Följande bild visar dialogrutan Anslut till diagram.
När GraphEdit läser in grafen körs den i målprogrammets kontext. Därför kan GraphEdit blockeras eftersom den väntar på tråden. Detta kan till exempel inträffa om du går igenom koden i felsökningsprogrammet.
Den här funktionen ska endast användas i felsökningsversioner av ditt program, inte i detaljhandelsversioner, eftersom den gör det möjligt för andra program att visa eller kontrollera filterdiagrammet.
Ansluta till en fjärrgraf från kommandoraden
GraphEdit stöder ett kommandoradsalternativ för att läsa in ett fjärrdiagram automatiskt vid start. Syntaxen är:
GraphEdt -a moniker
där moniker är en moniker som skapats med hjälp av funktionen AddToRot, som beskrevs tidigare.
Relaterade ämnen