實作 DllRegisterServer
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
最後一個步驟是實作 DllRegisterServer 函式。 包含元件的 DLL 必須匯出此函式。 此函式將由設定應用程式呼叫,或在使用者執行Regsvr32.exe工具時呼叫。
下列範例示範 DlLRegisterServer的最小實作:
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
AMovieDllRegisterServer2函式會為 中的每個元件建立登錄專案
g_Templates
陣列。 不過,此函式有一些限制。 首先,它會將每個篩選指派給 「DirectShow Filter」 類別 (CLSID_LegacyAmFilterCategory) ,但並非所有篩選都屬於此類別。 例如,擷取篩選和壓縮篩選準則有自己的類別。 其次,如果您的篩選支援硬體裝置,您可能需要註冊 AMovieDLLRegisterServer2 未處理的其他兩項資訊: 媒體 和 針腳類別。 媒體會定義硬體裝置中的通訊方法,例如匯流排。 針腳類別會定義針腳的函式。 如需媒體的相關資訊,請參閱 Microsoft Windows 驅動程式開發工具組 (DDK) 中的「KSPIN_MEDIUM」。 如需釘選類別清單,請參閱 Pin 屬性集。
如果您想要指定篩選類別、中型或釘選類別,請從DllRegisterServer內呼叫IFilterMapper2::RegisterFilter方法。 這個方法會採用 REGFILTER2 結構的指標,這個結構會指定篩選的相關資訊。
為了稍微複雜一點, REGFILTER2 結構支援兩種不同的格式來註冊針腳。 dwVersion成員指定格式:
- 如果 dwVersion 為 1,則針腳格式 AMOVIESETUP_PIN ( 先前所述) 。
- 如果 dwVersion 為 2,則針腳格式為 REGFILTERPINS2。
REGFILTERPINS2結構包含針腳媒體和針腳類別的專案。 此外,它會針對 AMOVIESETUP_PIN 宣告為布林值的某些專案使用位旗標。
下列範例示範如何從DllRegisterServer內部呼叫IFilterMapper2::RegisterFilter:
REGFILTER2 rf2FilterReg = {
1, // Version 1 (no pin mediums or pin category).
MERIT_NORMAL, // Merit.
1, // Number of pins.
&sudPins // Pointer to pin information.
};
STDAPI DllRegisterServer(void)
{
HRESULT hr;
IFilterMapper2 *pFM2 = NULL;
hr = AMovieDllRegisterServer2(TRUE);
if (FAILED(hr))
return hr;
hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
IID_IFilterMapper2, (void **)&pFM2);
if (FAILED(hr))
return hr;
hr = pFM2->RegisterFilter(
CLSID_SomeFilter, // Filter CLSID.
g_wszName, // Filter name.
NULL, // Device moniker.
&CLSID_VideoCompressorCategory, // Video compressor category.
g_wszName, // Instance data.
&rf2FilterReg // Pointer to filter information.
);
pFM2->Release();
return hr;
}