Domanda

Sto usando un DirectShowLib che è un wrapper sottile per DirectShow. Ho enumerato con successo dispositivi BDA e raccolto le loro CLSID. Ora, quando l'utente seleziona un dispositivo per nome e io conosco il CLSID scelta, ho bisogno di aggiungere questo dispositivo al mio grafico di filtro.

Ho fatto la seguente:

Type type = Type.GetTypeFromCLSID(classid);
object device = Activator.CreateInstance(type);

Ora la domanda è - quale tipo di oggetto sono arrivato qui nel dispositivo? Debugger dimostra che è un oggetto COM valido. Se provo a lanciarlo a IBaseFilter, ottengo un'eccezione "Interfaccia non supportata". Posso gettarlo ai IMoniker successo. Ma poi se cerco di fare quanto segue:

int hr = graphBuilder.AddSourceFilterForMoniker(
    device, null, filtername, out receivedFilter);

ottengo un errore:

HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX

So che il metodo AddSourceFilterForMoniker funziona bene se lo uso subito dopo l'enumerazione, così sembra solo che non creare il giusto moniker.

Qual è il modo giusto per creare l'oggetto moniker se la classe id è nota, così posso passarlo al AddSourceFilterForMoniker?

È stato utile?

Soluzione

Solo una supposizione, ma sembra non si sta creando una IBindCtx attuazione. Tutte le operazioni che coinvolgono IMoniker che ho visto richiedere l'implementazione IBindCtx da passare al fine di fornire un contesto per operazioni che coinvolgono il moniker.

Detto questo, il AddSourceFilterForMoniker il metodo non è diversa, nel senso che non sta passando un contesto di associazione per il moniker.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top