從外部進程載入圖形
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
GraphEdit 可以載入外部進程所建立的篩選圖形。 透過這項功能,您可以確切查看應用程式所建置的篩選圖形,且應用程式中只有最少的額外程式碼數量。
注意
此功能需要 Windows 2000、Windows XP 或更新版本。
注意
從 Windows Vista 開始,您必須註冊proppage.dll才能啟用此功能。 Windows SDK 中包含Proppage.dll。
應用程式必須在 Running Object Table (ROT) 中註冊篩選圖形實例。 ROT 是可全域存取的查閱資料表,可追蹤執行中的物件。 物件會由 Moniker 在 ROT 中註冊。 若要連線到圖形,GraphEdit 會搜尋 ROT 中的 Moniker,其顯示名稱符合特定格式:
!FilterGraph X pid Y
其中 X 是 Filter Graph Manager 的十六進位位址, 而 Y 則是進程識別碼,也是十六進位。
當您的應用程式第一次建立篩選圖形時,請呼叫下列函式:
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;
}
此函式會建立篩選圖形的 Moniker 和新的 ROT 專案。 第一個參數是篩選圖形的指標。 第二個參數會接收可識別新 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。 在 GraphEdit 檔案 功能表中,按一下 [ 連線到遠端圖形... 在 [ 連接到圖形 ] 對話方塊中,選取應用程式 (pid) 的進程識別碼,然後按一下 [ 確定]。 GraphEdit 會載入篩選圖形並加以顯示。 請勿在此圖表上使用任何其他 GraphEdit 功能,這可能會造成非預期的結果。 例如,請勿新增或移除篩選,或停止並啟動圖形。 結束您的應用程式之前,請先關閉 GraphEdit。
注意
您的應用程式可能會在結束時叫用各種判斷提示。 您可以忽略這些錯誤。
下圖顯示 [ 連接到圖形] 對話方塊。
當 GraphEdit 載入圖形時,它會在目標應用程式的內容中執行。 因此,GraphEdit 可能會因為正在等候執行緒而封鎖。 例如,如果您要在偵錯工具中逐步執行程式碼,就會發生這種情況。
此功能只應用於應用程式的偵錯組建,而不是零售組建,因為它可讓其他應用程式檢視或控制篩選圖形。
從命令列連線到遠端圖形
GraphEdit 支援命令列選項,可在啟動時自動載入遠端圖表。 語法是:
GraphEdt -a moniker
其中 moniker 是使用 AddToRot 函式建立的 Moniker,先前所述。
相關主題