外部プロセスからのグラフのロード
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] ダイアログ ボックスを示す。
GraphEdit がグラフをロードするとき、グラフはターゲット アプリケーションのコンテキストで実行される。したがって、GraphEdit はスレッドが出現するまで待機するため、動作を停止することがある。たとえば、デバッガでコードをステップ実行するときにこの動作が発生することがある。
この機能を使うと、他のアプリケーションからフィルタ グラフの表示や制御ができるようになるため、アプリケーションのリテール ビルドではなく、デバッグ ビルドでのみ使用すること。
コマンド ラインからリモート グラフへの接続
GraphEdit では、起動時にリモート グラフを自動的にロードするコマンド ライン オプションをサポートしている。次に構文を示す。
GraphEdt -a moniker
ここで、moniker は前に説明した AddToRot 関数を使って作成されるモニカを示す。