我使用 Delphi 6 Pro 和 DSPACK DirectShow 组件库创建了一个推送源过滤器。我想私下使用过滤器,所以我不会为 DLL 创建 AX 文件。相反,我想直接创建过滤器。我在这方面找到了一些线程,但它们都没有显示如何在给定过滤器的构造函数的情况下构造私有过滤器:
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
如何在 EXE 中直接嵌入 DirectShow Push Source 过滤器?
Filter 的源代码已直接添加到我的 Delphi 项目中。但是我不知道直接从我的主应用程序创建过滤器时应该使用哪个构造函数,以及为构造函数的参数传递什么。有人能告诉我他们应该是什么吗?
另外,我是否需要像上面第一个线程所说的那样增加 Filter 对象的引用计数,然后在我的应用程序终止时对其调用 Release() ?如果是这样,最好的方法是什么?或者我可以在我的应用程序终止时在过滤器上调用 Free 吗?
最后,在使用我的私有过滤器之前,我需要调用 CoInitialized() 和 CoUninitialize() 吗?
更新:通过 TBCSource(DSPACK 派生过滤器的基类)的类和类层次构造函数链进行跟踪,似乎ObjName参数是过滤器名称,而Unk参数是拥有过滤器的对象。我目前的猜测是,直接从源创建过滤器的正确方法是,给定一个名为 TPushSourceFilter 的 TBCSource 派生类,任意给定过滤器名称“我的推送源过滤器”,例如:
TPushSourceFilter.Create('My Push Source Filter', nil, hr);
第一个构造函数参数是用于注册过滤器的过滤器名称,即您在 GraphEdt 之类的工具中细读 DirectShow 过滤器时看到的名称。我认为第二个参数应该是 NIL,因为它解析为名为 TBCUnknown 的祖先类中的所有者数据字段 (FOwner)。它的唯一目的是将基类处理的任何 QueryInterface() 调用重定向到所有者对象(如果它是非 NIL),而不是将查询直接应用于 Filter 对象以防它是委托情况。我将继续使用这种构造方法,看看它是否有效。