这两天写的一个DShow的东东,在退出的时候,释放总有问题。
IGraphBuilder->Release(),会死在这句话!
一开始,认为可能是引用计数的问题,于是,就仔细查找。
查找的过程,总是进步和过程,也是因为此,我弄清楚了引用计数的添删。
1。如果使用CComPtr<IXXX> pXXX,则在 pXXX = pXXX2 的时候,引用计数会加1。
2。CoCreateInterface和QueryInterface时,如果成功,则引用计数会加1。
3。如果用用IXXX * pXXX,则在 pXXX= pXXX2 的时候,引用计数不变。
4。如果用进程内Filter,刚在pXXX = new CXXX() 的时候,引用计数不增加,为0。
在这个过程中,还找到了一个错误,也就解决了IGraphBuilder->Release()的问题,
那就是在写Filter的过程中,对于CBaseFilter::Stop的重载中,要确保每一个返回处,
都要调用 return CBaseFilter::Stop()