2010-05-10 6 views
1

J'ai un filtre DirectShow personnalisé créé en étendant le filtre ezrgb24 à partir de l'exemple de documentation DirectShow. J'utilise ce filtre (indirectement) en C# via un SDK multimédia tiers (LeadTools). Maintenant, j'ai besoin d'ajouter une référence à la DLL du filtre au projet afin que je puisse lancer une interface IUnknown récupérée par le SDK à l'interface personnalisée du filtre.Problème référençant le filtre DirectShow de C#

J'ai essayé d'ajouter la référence DLL en ajoutant référence -> browse, et en utilisant tlbimp directement à la ligne de commande. Les deux approches aboutissent à l'erreur 'C: \ windows \ system32 \ ezrgb24.dll' n'est pas une bibliothèque de types valide.

Ai-je raté quelque chose? Les extensions que j'ai faites à l'exemple ezrgb24 sont plutôt triviales structurellement, essentiellement si quelqu'un a les exemples de DirectShow, ils connaissent exactement le code avec lequel je travaille.

Toute aide est grandement appréciée.

Tony.

Répondre

2

Vous devez écrire une interface en C# et utiliser l'attribut ComImport. Par exemple filtre échantillon de SDK regardera

[ComImport, 
InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1")] //guid defined for interface in example code 
public interface IIPEffect 
{ 
    [PreserveSig] 
    int get_IPEffect(out int effectTime, out double startTime, out double length); 

    [PreserveSig] 
    int set_IPEffect(int effectNum, double startTime, double length); 
} 

vous pouvez maintenant utiliser la définition d'interface est telle façon

//find IBaseFilter somehow 
var effectFilter = FindFilter() as IIPEffect; 
effectFilter.set_IPEffect(0, 0, 20); 

NOTE: dans la définition de l'interface, il est de type REFTIME en tant que paramètre de longueur et startTime, mais c'est un simple typedef et c'est pourquoi dans notre code c'est double. Pour plus d'informations sur la conversion de la définition d'interface en C#, vous pouvez lire l'article marshaling sur msdn

+0

merci, cette méthode a fonctionné avec brio pour mes fins. –

+0

vous vous attendez à ce que cela fonctionne si la DLL est enregistrée uniquement en utilisant regsvr32? Parce que j'essaie d'appeler set_IPEffect et il me lance une exception. Désolé de faire cette vieille réponse mais j'ai besoin d'un conseil – cmario

+0

Oui, ça devrait marcher. Quel genre d'exception est lancée? – Yurec

1

Les exemples de filtres DirectShow standard n'implémentent pas les interfaces compatibles IDispatch. De plus, il n'y a pas de bibliothèques de types dans ces DLL. Vous devez implémenter votre propre interface de bibliothèque de types.

Vous pouvez utiliser ATL pour cela.

Questions connexes