2

我正在开发一个 DirectShow CSource 捕获过滤器。它工作正常,但是当我关闭使用过滤器的程序时(在这种情况下,我正在使用 VLC 进行测试,但其他程序也会发生同样的情况),程序崩溃(如果我在 Visual Studio 中调试它,那么断点被触发)。

我一直在寻找这个问题一段时间,发现我的源过滤器和源流都没有被释放;也就是说,它们的引用计数器在程序结束时为 1,DllCanUnloadNow() 函数报告有 2 个对象仍在使用中,并且当调用 CoUninitialize() 时,程序崩溃。

我很确定引用计数器得到了正确处理,因为我使用的是基类实现。我能想到的软件中唯一不寻常的事情是我使用的是我自己的 DllGetClassObject() 版本:我将 .DEF 文件配置为导出 MyDllGetClassObject() 而不是 DllGetClassObject(),因此我可以在之前插入一些代码调用默认实现。我认为这不是问题,因为我检查了在 MyDllGetClassObject() 末尾返回的所有对象的引用计数器是否为 1。

我想我错过了关于过滤器生命周期的一些东西,但不知道是什么(这是我正在开发的第一个捕获过滤器)。有什么建议吗?

先感谢您,

吉列尔莫

4

1 回答 1

1

我终于弄清楚发生了什么。我的源过滤器中的静态方法是在进程关闭时InitializeInstance调用的bLoading == falserclsid == <the GUID of my filter>这似乎是从过滤器实例中释放剩余引用计数器的合适位置。

CoUninitialize我从 StackOverflow 上的另一篇题为DirectShow code crash after exit (PushSourceDesktop sample)的帖子中得到了关于释放所有 COM 对象的重要性的关键思想。我所需要的只是多一点关于 DirectShow 过滤器生命周期的知识。

不管怎样,谢谢你的努力,罗曼,我知道这个线程从一开始就听起来很模糊:)

于 2012-09-11T07:36:06.693 回答