Een grafiek laden vanuit een extern proces
[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
GraphEdit kan een filtergrafiek laden die door een extern proces is gemaakt. Met deze functie kunt u precies zien welke filtergrafiek uw toepassing bouwt, met slechts een minimale hoeveelheid extra code in uw toepassing.
Notitie
Voor deze functie is Windows 2000, Windows XP of hoger vereist.
Notitie
Vanaf Windows Vista moet u proppage.dll registreren om deze functie in te schakelen. Proppage.dll is opgenomen in de Windows SDK.
De toepassing moet het filtergrafiekexemplaar registreren in de Running Object Table (ROT). De ROT is een wereldwijd toegankelijke opzoektabel waarmee actieve objecten worden bijgehouden. Objecten worden geregistreerd in de ROT door een moniker. Om verbinding te maken met de grafiek, zoekt GraphEdit in de ROT naar monikers waarvan de weergavenaam overeenkomt met een bepaalde indeling:
!FilterGraph X pid Y
waarbij X- het hexadecimale adres van Filter Graph Manager is en Y- de proces-id is, ook in hexadecimaal.
Wanneer uw toepassing voor het eerst de filtergrafiek maakt, roept u de volgende functie aan:
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;
}
Met deze functie maakt u een moniker en een nieuwe ROT-vermelding voor de filtergrafiek. De eerste parameter is een aanwijzer naar de filtergrafiek. De tweede parameter ontvangt een waarde die de nieuwe ROT-vermelding identificeert. Voordat de toepassing de filtergrafiek vrijgeeft, roept u de volgende functie aan om de ROT-vermelding te verwijderen. De parameter pdwRegister is de id die wordt geretourneerd door de functie AddToRot.
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
In het volgende codevoorbeeld ziet u hoe u deze functies aanroept. In dit voorbeeld wordt de code die ROT-vermeldingen toevoegt en verwijdert, voorwaardelijk gecompileerd, zodat deze alleen wordt opgenomen in builds voor foutopsporing.
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();
Als u de filtergrafiek in GraphEdit wilt weergeven, voert u uw toepassing en GraphEdit tegelijkertijd uit. Klik in het menu Bestand op Verbinding maken met Externe Graph.... Selecteer in het dialoogvenster Verbinding maken met Graph de proces-id (pid) van uw toepassing en klik op OK. GraphEdit laadt de filtergrafiek en geeft deze weer. Gebruik geen andere GraphEdit-functies in deze grafiek. Dit kan onverwachte resultaten veroorzaken. Voeg bijvoorbeeld geen filters toe of verwijder deze, of stop en start de grafiek. Sluit GraphEdit voordat u de toepassing afsluit.
Notitie
Uw toepassing kan verschillende asserties raken wanneer deze wordt afgesloten. U kunt deze negeren.
In de volgende afbeelding ziet u het dialoogvenster Verbinding maken met Graph.
Wanneer GraphEdit de grafiek laadt, wordt deze uitgevoerd in de context van de doeltoepassing. Daarom kan GraphEdit worden geblokkeerd omdat deze wacht op de thread. Dit kan bijvoorbeeld gebeuren als u uw code in het foutopsporingsprogramma doorloopt.
Deze functie moet alleen worden gebruikt in foutopsporingsversies van uw toepassing, niet in handelsversies, omdat andere toepassingen de filtergrafiek kunnen weergeven of beheren.
Verbinding maken met een externe grafiek vanaf de opdrachtregel
GraphEdit ondersteunt een opdrachtregeloptie voor het automatisch laden van een externe grafiek bij het opstarten. De syntaxis is:
GraphEdt -a moniker
waarbij moniker een moniker is die is gemaakt met behulp van de functie AddToRot, die eerder is beschreven.
Verwante onderwerpen