共用方式為


從外部進程載入圖形

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 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,先前所述。

使用 GraphEdit 模擬圖形建置