外部プロセスからのグラフのロード

GraphEdit は外部プロセスによって作成されたフィルタ グラフをロードできる。この機能を使うと、アプリケーションにわずかなコードを追加するだけで、アプリケーションで作成するフィルタ グラフを正確に知ることができる。

 :  この機能は、Windows 2000 または Windows XP を必要とする。

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

!FilterGraph X pid Y

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

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

HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    if (FAILED(GetRunningObjectTable(0, &pROT))) {
        return E_FAIL;
    }
    WCHAR wsz[256];
    wsprintfW(wsz, 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;
    
// フィルタ グラフ マネージャを作成する。
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// アプリケーションの残り部分 (省略)。

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

GraphEdit でフィルタ グラフを表示するには、アプリケーションと GraphEdit を同時に実行する。GraphEdit で [File] メニューの [Connect] をクリックする。[Connect To Graph] ダイアログ ボックスで、アプリケーションのプロセス id (pid) を選択し、[OK] をクリックする。GraphEdit はフィルタ グラフをロードし、表示する。予測できない結果になる可能性があるので、このグラフではその他の GraphEdit 機能を使わないこと。たとえば、フィルタの追加、削除、またはグラフの停止、開始は行わないこと。GraphEdit を終了してから、アプリケーションを終了する。

:  アプリケーションでは、終了時にさまざまなエラーが発生することがある。これらは無視できる。

次の図に [Connect To Graph] ダイアログ ボックスを示す。

[Connect To Graph] ダイアログ ボックス

GraphEdit がグラフをロードするとき、グラフはターゲット アプリケーションのコンテキストで実行される。したがって、GraphEdit はスレッドが出現するまで待機するため、動作を停止することがある。たとえば、デバッガでコードをステップ実行するときにこの動作が発生することがある。

この機能を使うと、他のアプリケーションからフィルタ グラフの表示や制御ができるようになるため、アプリケーションのリテール ビルドではなく、デバッグ ビルドでのみ使用すること。

コマンド ラインからリモート グラフへの接続

GraphEdit では、起動時にリモート グラフを自動的にロードするコマンド ライン オプションをサポートしている。次に構文を示す。

GraphEdt -a moniker

ここで、moniker は前に説明した AddToRot 関数を使って作成されるモニカを示す。