我现在用DirectShow来编程,我想做一个这样的函数,遍历IGraphBuilder中的每一个Filter,然后遍历这个Filter中的所有输入/输出Pin,断开Filter中的所有Pin,然后再释放掉IGraphBuilder中的Filter,这个函数应该有两个循环,一个是用来遍历IGraphBuilder中的Filter,再在这个循环中遍历这个Filter中的Pin,总之能断开所有Filter中的所有Pin和释放IGraphBuilder中的所有Filter就可以了,各位给点代码吧。
调试欢乐多
{
pGB->Release();
}
{
pGB->Release();
pGB = NULL;
}
定义:
#define HELPER_RELEASE(x) { if (x) x->Release();x=NULL;}然后用:
HELPER_RELEASE(pFilter);你说这样对不对???
你只需要保证正确的Release, 在COM里面 释放系统资源 不是你考虑的问题。
void UnloadFilter()
{
HRESULT hr;
IBaseFilter *pFilter = NULL;
IEnumFilters *pIFilterEnum = NULL; hr=pigb->EnumFilters(&pIFilterEnum); if(FAILED(hr))
{
MessageBox(NULL,"Cann't EnumFilters","Error",MB_OK);
goto err;
}
pIFilterEnum->Reset(); while(pIFilterEnum->Next(1,&pFilter,0)==S_OK)
{
FILTER_INFO FilterInfo;
hr = pFilter->QueryFilterInfo(&FilterInfo);
if (FAILED(hr))
{
MessageBox(NULL, "Could not get the filter info","Error", MB_OK | MB_ICONERROR);
continue; // Maybe the next one will work.
} IEnumPins *pIEnumPin = NULL;
IPin *pIPin = NULL;
hr = pFilter->EnumPins(&pIEnumPin);
if(FAILED(hr))
{
MessageBox(NULL,"Cann't EnumPins","Error",MB_OK);
goto err;
} while(pIEnumPin->Next(1,&pIPin,0)==S_OK)
{
PIN_INFO pinInfo;
char szName[256];
pIPin->QueryPinInfo(&pinInfo);
WideCharToMultiByte(CP_ACP, 0, pinInfo.achName, -1, szName, 256, 0, 0);
pinInfo.pFilter->Release();
pIPin->Release();
} if(hr=pigb->RemoveFilter(pFilter) != S_OK)
{
MessageBox(NULL,"error","error",MB_OK);
goto err;
}
char szName[MAX_FILTER_NAME];
int cch = WideCharToMultiByte(CP_ACP, 0, FilterInfo.achName,
MAX_FILTER_NAME, szName, MAX_FILTER_NAME, 0, 0);
if(cch > 0)
{
MessageBox(NULL, szName, TEXT("Filter Name"), MB_OK);
}
if (FilterInfo.pGraph != NULL)
{
FilterInfo.pGraph->Release();
}
HELPER_RELEASE(pFilter);
pIFilterEnum->Reset();
}
err:
HELPER_RELEASE(pIFilterEnum);
}
以上这个函数应该是用来释放IGraphBuilder中的所有Filter和Pin的吧,那为什么我用了之后,系统资源还是释放不了呢???
1.
IFilter* pFilter;
QueryInterface(...&pFilter); //引用了该Filter
pFilter->doSomething(...)
...
pFilter->Release(). //释放该Filter
2.
IFilter* pFilter;
QueryInterface(..&pFilter); //引用Filter
IPin* pPin;
pFilter->QueryPin(...&pPin); //引用Pin
pPin->doSomething(..);
...pPin->Release(); //释放Pin
pFilter->Release(); //释放Filter