註冊 DMO

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

為了讓用戶端使用您的 DMO,CLSID 必須在使用者的系統上註冊。 這是透過 DLL 的 DllRegisterServer 函 式來完成。 如果您使用 Active Template Library (ATL) ,ATL 精靈會自動產生此函式。

您也可以在一或多個標準 DMO 類別下註冊 DMO。 這可讓用戶端使用 DMOEnum 函式來探索您的 DMO。 類別是由 GUID 定義,並列在 DMO GUID 區段中。

在類別下註冊 DMO 是選擇性的。 若要這樣做,請呼叫 DMORegister 函式,並指定 DMO、CLSID 和類別的易記名稱。 您也可以選擇性地註冊一組 DMO 支援的媒體類型。 如需詳細資訊,請參閱 DMO 媒體類型

下列範例示範如何註冊支援 PCM 音訊輸入和輸出的音訊效果 DMO。 在此情況下,輸入類型和輸出類型相同。

STDAPI DllRegisterServer(void)
{
    // Register the DMO as a PCM audio effect DMO
    DMO_PARTIAL_MEDIATYPE mt;
    mt.type    = MEDIATYPE_Audio;
    mt.subtype = MEDIASUBTYPE_PCM;
    HRESULT hr = DMORegister(
        L"MyDMO",                  // Friendly name
        CLSID_MyDMO,               // CLSID
        DMOCATEGORY_AUDIO_EFFECT,  // Category
        0,                         // Flags 
        1,                         // Number of input types
        &mt,                       // Array of input types
        1,                         // Number of output types
        &mt);                      // Array of output types

    if (FAILED(hr)) return hr;

    // Registers the object, with no typelib.
    return _Module.RegisterServer(FALSE);
}

此範例假設 ATL 是用來建立專案;函式的最後一行會呼叫標準 ATL 方法來註冊 COM 伺服器。 如果您未使用 ATL,您的函式看起來會不同。

取消註冊 DMO

DllUnregisterServer函式必須移除DllRegisterServer函式所建立的任何登錄專案。 如果您在註冊 DMO 時呼叫 DMORegister ,當您取消註冊 DMO 時,必須使用相同類別的 DMOUnregister

下列範例會移除上一個範例中建立的登錄專案:

STDAPI DllUnregisterServer(void)
{
    DMOUnregister(CLSID_MyDMO, DMOCATEGORY_AUDIO_EFFECT);
    return _Module.UnregisterServer(TRUE);
}

DirectShow 優點值

為了建置篩選圖形,DirectShow 會將預設值指派給 DMO。 您可以在 HKEY_CLASSES_ROOT\CLSID 中將登錄專案新增至 DMO 的登錄機碼,以覆寫此值。 包含名為 的 MeritDWORD值,其值指定優點。

撰寫 DMO