從外部進程載入圖形
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine以及媒體基礎中的音訊/視訊擷取 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
GraphEdit 可以載入外部進程所建立的篩選圖表。 透過這項功能,您可以看到應用程式所建置的篩選圖形,且應用程式中只有最少的額外程序代碼量。
註解
此功能需要 Windows 2000、Windows XP 或更新版本。
注意
從 Windows Vista 開始,您必須註冊 proppage.dll 才能啟用此功能。 Proppage.dll 包含在 Windows SDK 中。
應用程式必須在執行的對象數據表 (ROT) 中註冊篩選圖形實例。 ROT 是可全域存取的查閱數據表,可追蹤執行中的物件。 物件會透過名稱在註冊物件表 (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;
}
此函式會為篩選圖形建立一個命名物件和一個新的 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 檔案] 功能表中,按兩下 [連線至遠端圖形...] 在 [連線至 Graph] 對話框中,選取應用程式的進程標識碼 (pid),然後按兩下 [確定] [確定]。 GraphEdit 會載入篩選圖形並加以顯示。 請勿在此圖表上使用任何其他 GraphEdit 功能,這可能會導致非預期的結果。 例如,不要新增或移除篩選,或停止並啟動圖形。 在結束應用程式之前關閉 GraphEdit。
註
您的應用程式可能會在結束運行時遇到各種斷言錯誤。 您可以忽略這些。
下圖顯示 連線至圖形 對話框。
當 GraphEdit 載入圖形時,它會在目標應用程式的內容中執行。 因此,GraphEdit 可能會封鎖,因為它正在等候線程。 例如,如果您在調試器中逐步執行您的代碼,就會發生這種情況。
此功能應僅用於應用程式的偵錯組建,而非正式組建,因為它可能使其他應用程式檢視或控制過濾圖形。
從命令行連線到遠端圖形
GraphEdit 支援命令行選項,可在啟動時自動載入遠端圖形。 語法為:
GraphEdt -a moniker
其中 名稱 是使用 AddToRot 函式建立的名稱,如前所述。
相關主題
-
使用 GraphEdit 模擬圖形建置