外部プロセスからのグラフの読み込み
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/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 関数を使用して作成されたモニカーです。
関連トピック