问题引用来自C#的directshow过滤器

时间:2010-05-10 13:47:29

标签: c# com interop directshow

我通过从DirectShow示例文档扩展ezrgb24过滤器来创建自定义DirectShow过滤器。

我通过第三方多媒体SDK(LeadTools)在C#中使用此过滤器(间接)。现在我需要向项目中添加对过滤器DLL的引用,以便我可以将SDK检索到的IUnknown接口转换为过滤器自己的自定义接口。

我尝试通过添加引用添加DLL引用 - >浏览,并直接在命令行使用tlbimp。这两种方法都会导致错误'C:\ windows \ system32 \ ezrgb24.dll'不是有效的类型库。

我错过了什么吗?我对ezrgb24示例所做的扩展在结构上非常简单,基本上如果有人有DirectShow示例,他们就知道我正在使用的代码。

非常感谢任何和所有帮助。

贝。

2 个答案:

答案 0 :(得分:2)

您需要在C#中编写接口并使用ComImport属性。例如,SDK中的示例过滤器将显示为

[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);
}

现在你可以使用接口定义了这样的方式

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

注意:在接口定义中,REFTIME类型作为length和startTime的参数,但它是简单的typedef,这就是为什么在我们的代码中它是double。有关将接口定义转换为C#的更多信息,请阅读msdn上的marshaling文章

答案 1 :(得分:1)

标准DirectShow过滤器示例不实现IDispatch兼容接口。此外,这些dll中没有类型库。您必须实现自己的类型库接口。

您可以使用ATL执行此操作。