DirechShow编程,怎样释放IGraphBuilder中的Filtert和Filter中的Pin?

lingbin 2003-08-23 09:09:35
我现在用DirectShow来编程,我想做一个这样的函数,遍历IGraphBuilder中的每一个Filter,然后遍历这个Filter中的所有输入/输出Pin,断开Filter中的所有Pin,然后再释放掉IGraphBuilder中的Filter,这个函数应该有两个循环,一个是用来遍历IGraphBuilder中的Filter,再在这个循环中遍历这个Filter中的Pin,总之能断开所有Filter中的所有Pin和释放IGraphBuilder中的所有Filter就可以了,各位给点代码吧。
...全文
152 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
whoo 2003-08-25
  • 打赏
  • 举报
回复
>>但是我用Release的时候,它不会释放系统资源,我用Release后,它的返回值是3UL...

如果你的release没有用错的话,那么这就是正常现象。在重复一次,释放系统资源 不是由你决定的,因为既不需要你来决定,你有时候也无法决定。

Release 后返回3 , 说明还有 3 个引用。就是这个意思! 这3个引用 不一定是你做的,不一定需要你负责。 你强行要负责的话,只会引起系统出错。

再来一次重点:
你只需要保证正确的Release, 在COM里面 释放系统资源 不是你考虑的问题。
whoo 2003-08-25
  • 打赏
  • 举报
回复
哎,晕啊。 你要我重复多少次才能明白 “系统资源” 不是你能做的事,也不应该有你来做!

这段代码从设计到编写都是错误的。

如果你用了一个Filter, 那么你就要Release他,你不需要,也无法关心这个Filter下面有几个Pin, 上面有什么Graph,除非你也用到了他们。

做好你自己的事情就行了。

来个简单的代码实例吧:
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
lingbin 2003-08-25
  • 打赏
  • 举报
回复
to whoo:
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的吧,那为什么我用了之后,系统资源还是释放不了呢???
taianmonkey 2003-08-24
  • 打赏
  • 举报
回复
if(pGB)
{
pGB->Release();
pGB = NULL;
}
taianmonkey 2003-08-24
  • 打赏
  • 举报
回复
if(pGB)
{
pGB->Release();
}
lingbin 2003-08-24
  • 打赏
  • 举报
回复
但是我用Release的时候,它不会释放系统资源,我用Release后,它的返回值是3UL,意思就是说还有三个指针指向它,它应该是不会释放了,但是我再用Release后它又会出错,这是怎么回事。
lingbin 2003-08-24
  • 打赏
  • 举报
回复
高手呢????????????
whoo 2003-08-24
  • 打赏
  • 举报
回复
一点解释:

com 里面没有释放不释放的问题,你只有使用何不使用的问题,这是由com自己机制决定的。当你使用的时候,用QueryInterface或者直接AddRef;不使用的时候Release。 至于何时释放,com自己会决定,不用你操心。

只要你按照规则来使用,com会在适当的时候自动释放的。
lingbin 2003-08-24
  • 打赏
  • 举报
回复
to taianmonkey() :
定义:
#define HELPER_RELEASE(x) { if (x) x->Release();x=NULL;}

然后用:
HELPER_RELEASE(pFilter);

你说这样对不对???
lingbin 2003-08-23
  • 打赏
  • 举报
回复
对了,如果断开Filter中的Pin和Release了这些Filter,那么它还会不会占用系统资源。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧