我现在用DirectShow来编程,我想做一个这样的函数,遍历IGraphBuilder中的每一个Filter,然后遍历这个Filter中的所有输入/输出Pin,断开Filter中的所有Pin,然后再释放掉IGraphBuilder中的Filter,这个函数应该有两个循环,一个是用来遍历IGraphBuilder中的Filter,再在这个循环中遍历这个Filter中的Pin,总之能断开所有Filter中的所有Pin和释放IGraphBuilder中的所有Filter就可以了,各位给点代码吧。

解决方案 »

  1.   

    对了,如果断开Filter中的Pin和Release了这些Filter,那么它还会不会占用系统资源。
      

  2.   

    一点解释:com 里面没有释放不释放的问题,你只有使用何不使用的问题,这是由com自己机制决定的。当你使用的时候,用QueryInterface或者直接AddRef;不使用的时候Release。 至于何时释放,com自己会决定,不用你操心。只要你按照规则来使用,com会在适当的时候自动释放的。
      

  3.   

    但是我用Release的时候,它不会释放系统资源,我用Release后,它的返回值是3UL,意思就是说还有三个指针指向它,它应该是不会释放了,但是我再用Release后它又会出错,这是怎么回事。
      

  4.   

    if(pGB)
    {
    pGB->Release();
    }
      

  5.   

    if(pGB)
    {
    pGB->Release();
    pGB = NULL;
    }
      

  6.   

    to taianmonkey() :
    定义:
    #define HELPER_RELEASE(x) { if (x) x->Release();x=NULL;}然后用:
    HELPER_RELEASE(pFilter);你说这样对不对???
      

  7.   

    >>但是我用Release的时候,它不会释放系统资源,我用Release后,它的返回值是3UL...如果你的release没有用错的话,那么这就是正常现象。在重复一次,释放系统资源 不是由你决定的,因为既不需要你来决定,你有时候也无法决定。Release 后返回3 , 说明还有 3 个引用。就是这个意思! 这3个引用 不一定是你做的,不一定需要你负责。 你强行要负责的话,只会引起系统出错。再来一次重点:
    你只需要保证正确的Release, 在COM里面 释放系统资源 不是你考虑的问题。
      

  8.   

    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的吧,那为什么我用了之后,系统资源还是释放不了呢???
      

  9.   

    哎,晕啊。 你要我重复多少次才能明白 “系统资源” 不是你能做的事,也不应该有你来做!这段代码从设计到编写都是错误的。如果你用了一个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