Menerapkan DllRegisterServer
[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
Langkah terakhir adalah menerapkan fungsi DllRegisterServer . DLL yang berisi komponen harus mengekspor fungsi ini. Fungsi ini akan dipanggil oleh aplikasi pengaturan, atau ketika pengguna menjalankan alat Regsvr32.exe.
Contoh berikut menunjukkan implementasi minimal DlLRegisterServer:
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
Fungsi AMovieDllRegisterServer2 membuat entri registri untuk setiap komponen dalam
g_Templates
Array. Namun, fungsi ini memiliki beberapa batasan. Pertama, ini menetapkan setiap filter ke kategori "DirectShow Filters" (CLSID_LegacyAmFilterCategory), tetapi tidak setiap filter termasuk dalam kategori ini. Mengambil filter dan filter kompresi, misalnya, memiliki kategorinya sendiri. Kedua, jika filter Anda mendukung perangkat keras, Anda mungkin perlu mendaftarkan dua informasi tambahan yang tidak ditangani oleh AMovieDLLRegisterServer2 : kategori sedang dan pin. Media mendefinisikan metode komunikasi dalam perangkat keras, seperti bus. Kategori pin mendefinisikan fungsi pin. Untuk informasi tentang media, lihat "KSPIN_MEDIUM" di Microsoft Windows Driver Development Kit (DDK). Untuk daftar kategori pin, lihat Menyematkan Kumpulan Properti.
Jika Anda ingin menentukan kategori filter, sedang, atau kategori pin, panggil metode IFilterMapper2::RegisterFilter dari dalam DllRegisterServer. Metode ini mengambil penunjuk ke struktur REGFILTER2 , yang menentukan informasi tentang filter.
Untuk mempersulit masalah, struktur REGFILTER2 mendukung dua format berbeda untuk mendaftarkan pin. Anggota dwVersion menentukan format:
- Jika dwVersion adalah 1, format pin AMOVIESETUP_PIN (dijelaskan sebelumnya).
- Jika dwVersion adalah 2, format pinnya adalah REGFILTERPINS2.
Struktur REGFILTERPINS2 mencakup entri untuk media pin dan kategori pin. Selain itu, ia menggunakan bendera bit untuk beberapa item yang AMOVIESETUP_PIN deklarasikan sebagai nilai Boolean.
Contoh berikut menunjukkan cara memanggil IFilterMapper2::RegisterFilter dari dalam DllRegisterServer:
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;
}