我正在开发DirectShow CSource捕获过滤器。它运行正常,但是当我关闭使用过滤器的程序时(在这种情况下,我正在使用VLC进行测试,但其他程序也是如此),程序崩溃(如果我在Visual Studio中调试它,那么断点被触发)。
我一直在寻找这个问题已经有一段时间了,发现我的源代码过滤器和源代码流都没有被释放;也就是说,它们的引用计数器在程序结束时为1,DllCanUnloadNow()函数报告仍然有2个对象在使用,并且,当调用CoUninitialize()时,程序崩溃。
我很确定引用计数器正在被正确处理,因为我正在使用基类实现。我能想到的唯一不寻常的事情就是我正在使用我自己的DllGetClassObject()版本:我配置了.DEF文件以导出MyDllGetClassObject()而不是DllGetClassObject()所以我可以在之前插入一些代码调用默认实现。我不认为这是一个问题,因为我已经检查过我在MyDllGetClassObject()末尾返回的所有对象的引用计数器是1。
我想我错过了关于过滤器生命周期的一些内容,但无法弄清楚是什么(这是我正在开发的第一个捕获过滤器)。有什么建议吗?
提前谢谢你,
吉列尔莫
答案 0 :(得分:1)
我终于弄清楚发生了什么。我的源过滤器中的静态方法InitializeInstance
在进程关闭时使用bLoading == false
和rclsid == <the GUID of my filter>
进行调用。这似乎是从过滤器实例中释放剩余引用计数器的合适位置。
我得到了一个关键的想法,即在CoUninitialize
前一段时间之前,从标题为DirectShow code crashes after exit (PushSourceDesktop sample)的StackOverflow上的另一篇文章释放所有COM对象是多么重要。我所需要的只是对DirectShow过滤器生命周期的更多了解。
无论如何,谢谢你的努力,罗曼,我知道这个帖子从一开始听起来有多模糊:)