Implémentation de DllRegisterServer

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

La dernière étape consiste à implémenter la fonction DllRegisterServer . La DLL qui contient le composant doit exporter cette fonction. La fonction est appelée par une application de configuration ou lorsque l’utilisateur exécute l’outil Regsvr32.exe.

L’exemple suivant montre une implémentation minimale de DlLRegisterServer :

STDAPI DllRegisterServer(void)
{
    return AMovieDllRegisterServer2(TRUE);
}

La fonction AMovieDllRegisterServer2 crée des entrées de Registre pour chaque composant du

g_Templates

. Toutefois, cette fonction présente certaines limitations. Tout d’abord, il affecte chaque filtre à la catégorie « Filtres directShow » (CLSID_LegacyAmFilterCategory), mais tous les filtres n’appartiennent pas à cette catégorie. Les filtres de capture et les filtres de compression, par exemple, ont leurs propres catégories. Ensuite, si votre filtre prend en charge un périphérique matériel, vous devrez peut-être inscrire deux éléments d’informations supplémentaires qu’AMovieDLLRegisterServer2 ne gère pas : le support et la catégorie d’épingle. Un support définit une méthode de communication dans un appareil matériel, tel qu’un bus. La catégorie d’épingle définit la fonction d’une broche. Pour plus d’informations sur les supports, consultez « KSPIN_MEDIUM » dans le Kit de développement du pilote Microsoft Windows (DDK). Pour obtenir la liste des catégories d’épingles, consultez Pin Property Set.

Si vous souhaitez spécifier une catégorie de filtre, un support ou une catégorie d’épingle, appelez la méthode IFilterMapper2::RegisterFilter à partir de DllRegisterServer. Cette méthode prend un pointeur vers une structure REGFILTER2 , qui spécifie des informations sur le filtre.

Pour compliquer quelque peu les choses, la structure REGFILTER2 prend en charge deux formats différents pour l’inscription des broches. Le membre dwVersion spécifie le format :

  • Si dwVersion a la valeur 1, le format d’épingle est AMOVIESETUP_PIN (décrit précédemment).
  • Si dwVersion a la valeur 2, le format d’épingle est REGFILTERPINS2.

La structure REGFILTERPINS2 inclut des entrées pour les supports d’épingle et les catégories de broches. En outre, il utilise des indicateurs de bits pour certains éléments qui AMOVIESETUP_PIN déclarent en tant que valeurs booléennes.

L’exemple suivant montre comment appeler IFilterMapper2::RegisterFilter à partir de 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;
}