Chargement d’un graphique à partir d’un processus externe

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

GraphEdit peut charger un graphique de filtre créé par un processus externe. Avec cette fonctionnalité, vous pouvez voir exactement quel graphique de filtre votre application génère, avec seulement une quantité minimale de code supplémentaire dans votre application.

Notes

Cette fonctionnalité nécessite Windows 2000, Windows XP ou version ultérieure.

 

Notes

À compter de Windows Vista, vous devez inscrire proppage.dll pour activer cette fonctionnalité. Proppage.dll est inclus dans le Kit de développement logiciel (SDK) Windows.

 

L’application doit inscrire le graphe de filtre instance dans la table d’objets en cours d’exécution (ROT). Le ROT est une table de recherche globalement accessible qui effectue le suivi des objets en cours d’exécution. Les objets sont inscrits dans rot par moniker. Pour vous connecter au graphe, GraphEdit recherche dans le ROT des monikers dont le nom d’affichage correspond à un format particulier :

!FilterGraph X pid Y

X est l’adresse hexadécimale du Gestionnaire de graphes de filtre et Y est l’ID de processus, également en hexadécimal.

Lorsque votre application crée le graphe de filtre pour la première fois, appelez la fonction suivante :

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

Cette fonction crée un moniker et une nouvelle entrée ROT pour le graphe de filtre. Le premier paramètre est un pointeur vers le graphe de filtre. Le deuxième paramètre reçoit une valeur qui identifie la nouvelle entrée ROT. Avant que l’application ne libère le graphe de filtre, appelez la fonction suivante pour supprimer l’entrée ROT. Le paramètre pdwRegister est l’identificateur retourné par la fonction AddToRot.

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

L’exemple de code suivant montre comment appeler ces fonctions. Dans cet exemple, le code qui ajoute et supprime des entrées ROT est compilé de manière conditionnelle, de sorte qu’il soit inclus uniquement dans les builds de débogage.

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

Pour afficher le graphe de filtre dans GraphEdit, exécutez votre application et GraphEdit en même temps. Dans le menu GraphModifier le fichier , cliquez sur Se connecter à Remote Graph... Dans la boîte de dialogue Se connecter à Graph , sélectionnez l’ID de processus (pid) de votre application, puis cliquez sur OK. GraphEdit charge le graphe de filtre et l’affiche. N’utilisez pas d’autres fonctionnalités GraphEdit sur ce graphique. Cela peut entraîner des résultats inattendus. Par exemple, n’ajoutez pas ou ne supprimez pas de filtres, ou arrêtez et démarrez le graphe. Fermez GraphEdit avant de quitter votre application.

Notes

Votre application peut atteindre différents assertions lorsqu’elle se termine. Vous pouvez les ignorer.

 

L’illustration suivante montre la boîte de dialogue Se connecter à Graph .

se connecter au graphique

Lorsque GraphEdit charge le graphe, il s’exécute dans le contexte de l’application cible. Par conséquent, GraphEdit peut bloquer, car il attend le thread. Par exemple, cela peut se produire si vous parcourez votre code dans le débogueur.

Cette fonctionnalité doit être utilisée uniquement dans les builds de débogage de votre application, et non dans les builds commerciales, car elle permet à d’autres applications d’afficher ou de contrôler le graphe de filtre.

Connexion à un graphique distant à partir de la ligne de commande

GraphEdit prend en charge une option de ligne de commande pour charger automatiquement un graphique distant au démarrage. La syntaxe est :

GraphEdt -a moniker

moniker est un moniker créé à l’aide de la fonction AddToRot, décrite précédemment.

Simulation de génération de graphiques avec GraphEdit