【发布时间】:2012-09-06 07:57:23
【问题描述】:
我正在开发 DirectShow CSource 捕获过滤器。它工作正常,但是当我关闭使用过滤器的程序时(在这种情况下,我正在使用 VLC 进行测试,但其他程序也会发生同样的情况),程序崩溃(如果我在 Visual Studio 中调试它,那么断点被触发)。
我一直在寻找这个问题一段时间,发现我的源过滤器和源流都没有被释放;也就是说,它们的引用计数器在程序结束时为 1,DllCanUnloadNow() 函数报告有 2 个对象仍在使用中,当调用 CoUninitialize() 时,程序崩溃。
我很确定引用计数器得到了正确处理,因为我使用的是基类实现。我能想到的软件中唯一不寻常的事情是我使用的是我自己的 DllGetClassObject() 版本:我将 .DEF 文件配置为导出 MyDllGetClassObject() 而不是 DllGetClassObject(),因此我可以在之前插入一些代码调用默认实现。我认为这不是问题,因为我检查了在 MyDllGetClassObject() 末尾返回的所有对象的引用计数器是否为 1。
我想我遗漏了有关过滤器生命周期的一些信息,但不知道是什么(这是我正在开发的第一个捕获过滤器)。有什么建议吗?
提前谢谢你,
吉列尔莫
【问题讨论】:
-
崩溃/异常时是否有堆栈跟踪?
-
堆栈跟踪不包含我的任何函数:KernelBase.dll!76c7280c() [下面的帧可能不正确和/或丢失,没有为 KernelBase.dll 加载符号] MyFilters.dll! DbgAssert(const wchar_t *pCondition=0x00540052, const wchar_t * pFileName=0x00460020, int iLine=0x00690061) 第 557 行 + 0x8 字节 C++ 00450053()
-
MyFilters.dll不是您的代码吗?DbgAssert表明这是一个调试版本。 -
MyFilters.dll包含我的代码,但DbgAssert是基类的一部分。这是一个调试版本,但在发布版本中也会发生同样的情况。我在DebugBreak之前设置了一个断点,并且在调用_DllEntryPoint(由DllEntryPoint调用)期间引发了错误。_DllEntryPoint充满了抱怨MyFilters.dll持有两个活物的消息。我相信我不会在我应该做的地方释放我的对象。我是否必须释放MyDllGetClassObject和IClassFactory返回的过滤器(这两个都是我实现的)?如果是,我应该在哪里做? -
DbgAssert表示您的 DLL 有问题。这是对 COM 指针和引用的不正确操作。您还没有提供任何信息来说明究竟是什么问题。由您来调试,看看哪些项目未发布,可能是什么原因。
标签: com directshow