我通过从DirectShow示例文档扩展ezrgb24过滤器来创建自定义DirectShow过滤器。
我通过第三方多媒体SDK(LeadTools)在C#中使用此过滤器(间接)。现在我需要向项目中添加对过滤器DLL的引用,以便我可以将SDK检索到的IUnknown接口转换为过滤器自己的自定义接口。
我尝试通过添加引用添加DLL引用 - >浏览,并直接在命令行使用tlbimp。这两种方法都会导致错误'C:\ windows \ system32 \ ezrgb24.dll'不是有效的类型库。
我错过了什么吗?我对ezrgb24示例所做的扩展在结构上非常简单,基本上如果有人有DirectShow示例,他们就知道我正在使用的代码。
非常感谢任何和所有帮助。
贝。
答案 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执行此操作。