我自己写的一个Source Filter,在程序里构建Graph后,运行正常,但点退出的时候会退出ASSERT,
Executable:xxx.exe Pid e3c Tid 7a4. Module xxx.ax, 3objects left active!
At line 316 of .\dllentry.cpp
查了些资料说可能是因为在代码里某些地方用AddRef增加了Filter的reference count, 但却没有release,导致Filter的reference count不为0, 其析构函数不会被调用。
我的Filter继承了CSource类, 跟踪代码(->CBaseFilter->CUnknown)发现在CUnknown类里有一个protected成员 m_cref。
然后我调试时发现,调用CoCreateInstance后m_cref变为了1,这可以理解,但是不能理解的是接下来调用pFilterGraph->AddFilter()添加Filter后m_cref又增1了,以及后面的ConnectFilter这些m_cref都增1,正常情况是应该像这样的吗?? 这样的话后面这个m_cref是不是就不能减到0了,就会产生上面的错误。
大家有遇到过这种情况吗??
Any suggestions are welcome.
------解决方案--------------------------------------------------------
看下com的AddRef和Release说明,哪些地方需要addref哪些需要release,有详细说明
------解决方案--------------------------------------------------------
tianma_25,您好!
我没有遇到过这类错误。我查了下你的错误,看到http://blog.csdn.net/ljp2010/archive/2007/02/06/1503422.aspx里有人遇到,并解决。
他说是因为你调用了pEnumFilter->Next,pFilter->QueryFilterInfo,pEnumPin->Next这一类方法,而DirectShow帮助文档中说明:“Note the places where the function calls Release on an interface to decrement the reference count.”,也就是说,每调用一次枚举,就需要手动去调用释放方法来减少参考数。可能你没有相对应的Release方法。你如果再遇到这类问题,就查查是不是哪地方没有配对的枚举与释放。