共用方式為


從外部進程載入圖形

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine以及媒體基礎中的音訊/視訊擷取 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 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 模擬圖形建置