Pregunta

Estoy utilizando un DirectShowLib que es una envoltura delgada para DirectShow. He registrado con éxito dispositivos BDA y recogido sus CLSID. Ahora, cuando el usuario selecciona un dispositivo por su nombre y sé que el CLSID elegido, necesito agregar este dispositivo a mi gráfico de filtro.

Me hizo lo siguiente:

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

Ahora la pregunta es - ¿qué tipo de objeto que llegué en el dispositivo? Depurador muestra que se trata de un objeto COM válido. Si trato de echarlo a IBaseFilter, consigo una excepción "Interfaz no compatible". Puedo echarlo a IMoniker éxito. Pero entonces, si yo trato de hacer lo siguiente:

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

Me sale un error:

HRESULT: 0x800401e4 (2147746276)
Name: MK_E_SYNTAX

Yo sé que el AddSourceFilterForMoniker método funciona bien si lo uso justo después de la enumeración, por lo que parece que simplemente no crear la derecha apodo.

¿Cuál es la forma correcta de crear el objeto apodo si se conoce el ID de clase, por lo que puedo pasarlo al AddSourceFilterForMoniker?

¿Fue útil?

Solución

Sólo una conjetura, pero parece que no va a crear un IBindCtx aplicación. Todas las operaciones que implican IMoniker que he visto requerirá una aplicación IBindCtx a pasar el fin de proporcionar un contexto para las operaciones en el apodo.

Una vez dicho esto, el AddSourceFilterForMoniker método no es diferente, en la que no está pasando un contexto de enlace para el apodo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top