外部プロセスからのグラフの読み込み

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

GraphEdit では、外部プロセスによって作成されたフィルター グラフを読み込むことができます。 この機能を使用すると、アプリケーションで最小限の追加コードを使用するだけで、アプリケーションがビルドするフィルター グラフを正確に確認できます。

注意

この機能には、Windows 2000、Windows XP 以降が必要です。

 

注意

Windows Vista 以降では、この機能を有効にするには、proppage.dllを登録する必要があります。 Proppage.dllは Windows SDK に含まれています。

 

アプリケーションは、実行中のオブジェクト テーブル (ROT) にフィルター グラフ インスタンスを登録する必要があります。 ROT は、実行中のオブジェクトを追跡するグローバルにアクセス可能な検索テーブルです。 オブジェクトはモニカーによって ROT に登録されます。 グラフに接続するために、GraphEdit は ROT を検索して、表示名が特定の形式と一致するモニカーを検索します。

!FilterGraph X pid Y

ここで 、X はフィルター グラフ マネージャーの 16 進数アドレス、 Y はプロセス ID で、また 16 進数です。

アプリケーションでフィルター グラフを最初に作成するときは、次の関数を呼び出します。

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

この関数は、モニカーとフィルター グラフの新しい ROT エントリを作成します。 最初のパラメーターは、フィルター グラフへのポインターです。 2 番目のパラメーターは、新しい ROT エントリを識別する値を受け取ります。 アプリケーションがフィルター グラフを解放する前に、次の関数を呼び出して ROT エントリを削除します。 pdwRegister パラメーターは、AddToRot 関数によって返される識別子です。

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

次のコード例は、これらの関数を呼び出す方法を示しています。 この例では、ROT エントリを追加および削除するコードが条件付きでコンパイルされ、デバッグ ビルドにのみ含まれます。

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

GraphEdit でフィルター グラフを表示するには、アプリケーションと GraphEdit を同時に実行します。 [Graph][ ファイルの 編集] メニューの [ リモート グラフに接続 ]をクリックします。[ グラフに接続 ] ダイアログ ボックスで、アプリケーションのプロセス ID (pid) を選択し、[ OK] をクリックします。 GraphEdit によってフィルター グラフが読み込まれて表示されます。 このグラフで他の GraphEdit 機能を使用しないでください。予期しない結果が発生する可能性があります。 たとえば、フィルターを追加または削除したり、グラフを停止して開始したりしないでください。 アプリケーションを終了する前に GraphEdit を閉じます。

注意

アプリケーションが終了すると、さまざまなアサートにヒットする可能性があります。 これらは無視してかまいません。

 

次の図は、[ グラフに接続 ] ダイアログ ボックスを示しています。

グラフに接続する

GraphEdit によってグラフが読み込まれると、ターゲット アプリケーションのコンテキストで実行されます。 そのため、GraphEdit はスレッドを待機しているため、ブロックする可能性があります。 たとえば、デバッガーでコードをステップ実行する場合に発生する可能性があります。

この機能は、他のアプリケーションでフィルター グラフを表示または制御できるため、製品版のビルドではなく、アプリケーションのデバッグ ビルドでのみ使用する必要があります。

コマンド ラインからリモート グラフに接続する

GraphEdit では、起動時にリモート グラフを自動的に読み込むコマンドライン オプションがサポートされています。 の構文は次のとおりです。

GraphEdt -a moniker

ここで モニカー は、前述の AddToRot 関数を使用して作成されたモニカーです。

GraphEdit を使用したグラフの作成のシミュレーション