共用方式為


註冊 DMO

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine,以及媒體基金會中的音訊/視訊擷取 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼在可能的情況下使用 MediaPlayerIMFMediaEngine 和 Media Foundation 中的 音訊/視訊擷取,而不是 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 註冊表機碼,以覆寫此值。 包含 DWORD 值,Merit 其值指定優點。

撰寫 DMO