如何正确构建一个私有的未注册的DirectShow过滤器(有源代码)?

时间:2011-10-27 22:52:14

标签: delphi constructor filter directshow dspack

我使用Delphi 6 Pro和DSPACK DirectShow组件库创建了一个推送源过滤器。我想私下使用过滤器,所以我不会为DLL创建一个AX文件。相反,我想直接创建过滤器。我在这上面找到了一些线程但是它们都没有显示如何构造一个私有Filter给定过滤器的构造函数:

constructor Create(ObjName: string; Unk: IUnKnown; out hr: HRESULT);
constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override;

以下是我在未注册或私有DirectShow过滤器主题上找到的一些主题:

http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm

http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54

How can I directly embed a DirectShow Push Source filter in an EXE?

Filter的源代码已直接添加到我的Delphi项目中。但我不知道直接从我的主应用程序创建过滤器时应该使用哪个构造函数,以及为构造函数的参数传递什么。有人能告诉我他们应该是什么吗?

另外,我是否需要增加Filter对象的引用计数,就像第一个线程上面说的那样,然后在我的应用程序终止时调用它上面的Release()?如果是这样,最好的方法是什么?或者,当我的应用程序终止时,我可以在过滤器上调用Free吗?

最后,在使用私有过滤器之前,是否需要调用CoInitialized()和CoUninitialize()?

UPDATE :遍历TBCSource的类和类层次结构构造链,这是DSPACK派生过滤器的基类,似乎 ObjName 参数是过滤器名称并且 Unk 参数是拥有过滤器的对象。我目前的猜测是,直接从源创建Filter的正确方法是,给定一个名为TPushSourceFilter的TBCSource派生类,任意给出过滤器名称“My Push Source Filter”,例如:

TPushSourceFilter.Create('My Push Source Filter', nil, hr);

第一个构造函数参数是用于注册过滤器的过滤器名称,即在GraphEdt等工具中使用DirectShow过滤器时看到的过滤器名称。我相信第二个参数应该是NIL,因为它解析为名为TBCUnknown的祖先类中的所有者数据字段(FOwner)。它的唯一目的是将基类处理的任何QueryInterface()调用重定向到所有者对象(如果它是非NIL),而不是将查询直接应用于Filter对象,以防它是委托情况。我将继续使用这种构造方法,看看它是否有效。

1 个答案:

答案 0 :(得分:1)

您只需要一个对象TPushSourceFilter.Create的实例,并从此实例获取IBaseFilter接口。从那里开始,您可以像使用CoCreateInstance创建的过滤器一样将其添加到图表中,然后连接引脚等。