Condividi tramite


Implementazione di DllRegisterServer

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il passaggio finale consiste nell'implementare la funzione DllRegisterServer . La DLL che contiene il componente deve esportare questa funzione. La funzione verrà chiamata da un'applicazione configurata o quando l'utente esegue lo strumento di Regsvr32.exe.

Nell'esempio seguente viene illustrata un'implementazione minima di DlLRegisterServer:

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

La funzione AMovieDllRegisterServer2 crea voci del Registro di sistema per ogni componente nell'oggetto

g_Templates

matrice. Tuttavia, questa funzione presenta alcune limitazioni. In primo luogo, assegna ogni filtro alla categoria "Filtri DirectShow" (CLSID_LegacyAmFilterCategory), ma non ogni filtro appartiene a questa categoria. Acquisire filtri e filtri di compressione, ad esempio, hanno le proprie categorie. In secondo luogo, se il filtro supporta un dispositivo hardware, potrebbe essere necessario registrare due informazioni aggiuntive che AMovieDLLRegisterServer2 non gestisce: il supporto e la categoria di pin. Un supporto definisce un metodo di comunicazione in un dispositivo hardware, ad esempio un bus. La categoria pin definisce la funzione di un pin. Per informazioni sui supporti, vedere "KSPIN_MEDIUM" in Microsoft Windows Driver Development Kit (DDK). Per un elenco di categorie di pin, vedere Pin Property Set.

Se si vuole specificare una categoria di filtro, una categoria media o un pin, chiamare il metodo IFilterMapper2::RegisterFilter dall'interno di DllRegisterServer. Questo metodo accetta un puntatore a una struttura REGFILTER2 , che specifica informazioni sul filtro.

Per complicare in qualche modo, la struttura REGFILTER2 supporta due formati diversi per la registrazione dei pin. Il membro dwVersion specifica il formato:

  • Se dwVersion è 1, il formato del pin è AMOVIESETUP_PIN (descritto in precedenza).
  • Se dwVersion è 2, il formato pin è REGFILTERPINS2.

La struttura REGFILTERPINS2 include voci per le categorie pin medie e pin. Usa anche flag di bit per alcuni elementi che AMOVIESETUP_PIN dichiara come valori booleani.

Nell'esempio seguente viene illustrato come chiamare IFilterMapper2::RegisterFilter dall'interno di 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;
}