未发行的DirectShow CSource过滤器,使程序崩溃的过程中关闭(Unreleased D

2019-06-27 21:41发布

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

我一直在追捕这个问题了一段时间,发现这两个,我的源过滤器和我的源流没有被释放; 这是,它们的引用计数器1在程序的结尾,DllCanUnloadNow()函数报告有2米的物体仍然在使用,并且,被调用CoUninitialize()时,该程序崩溃。

我敢肯定的是,引用计数被正确地处理,因为我使用的基类的实现。 在我的软件中唯一不寻常的事情,我能想到的是,我用我自己的DllGetClassObject()的版本:我配置了DEF文件有MyDllGetClassObject()出口替代的DllGetClassObject(),所以我可以插入之前的一些代码调用默认的实现。 我不认为这是一个问题,因为我已经检查了我的)MyDllGetClassObject结束(返回所有对象的引用计数为1。

我想我失去了一些东西对过滤器的整个生命周期,但无法弄清楚什么(这是第一个捕获筛选我正在开发)。 任何建议?

先感谢您,

吉列尔莫

Answer 1:

我终于想通了事情的原委。 静态方法InitializeInstance在我的源过滤器被调用, bLoading == falserclsid == <the GUID of my filter>在过程关闭。 这似乎是适当的地方来释放过滤器实例剩余引用计数器。

我得到的是多么的重要之前释放所有的COM对象的核心理念CoUninitialize前段时间从StackOverflow上有权另一篇文章DirectShow的代码崩溃退出(PushSourceDesktop样品)后 。 所有我需要的是DirectShow的过滤器生命周期更多的只是一点点知识。

不管怎样,谢谢你的努力,罗马,我知道这个线程从一开始就如何模糊响起:)



文章来源: Unreleased DirectShow CSource filter makes program crash at process shutdown