XP下IvideoWindow窗口无法自动关闭问题的解决

GraphBuilder播放一次文件后(播放视频采集没有问题)有个残留的ActiveMovieWindow窗口,再播放就又出了一个,这个问题在2k下没有,只在xp上出现了.

验证此现象的代码:

mfc的dlg的测试代码:
#pragma comment(lib,"quartz.lib")
#pragma comment(lib,"vfw32.lib")
#pragma comment(lib,"quartz.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"version.lib")
#pragma comment(lib,"largeint.lib")
IGraphBuilder *pGraph;
    IMediaControl *pMediaControl;
    IMediaEvent   *pEvent;

void CTestGraphtBuilderDlg::OnButton1()
{

    CoInitialize(NULL);
   
    // Create the filter graph manager and query for interfaces.
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
    pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
    pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // Build the graph. IMPORTANT: Change string to a file on your system.
    pGraph->RenderFile(L"F://meida//成全.DAT", NULL);

    // Run the graph.
    pMediaControl->Run();

    // Wait for completion.
//    long evCode;
//    pEvent->WaitForCompletion(INFINITE, &evCode);

    // Clean up.


}

void CTestGraphtBuilderDlg::OnButton2()
{
pMediaControl->Stop();
    pMediaControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
}

被郁闷n久后解决了,是否还有其它问题待大家的反馈.

方法为: 将graph中的所有filter都断开,然后都RemoveFilter.

//主工程中

   IBaseFilter* pHeadFilter = NULL;
   pHeadFilter = mDXTool.GetHeadFilter(mpVideoGrabber); //取到初始端filter
   mDXTool.NukeDownstream(pHeadFilter,mpGraphBuilder);// 从初始filter开始 全部干掉
   SAFE_RELEASE(pHeadFilter);

功能函数:

#define BeginEnumPins(pBaseFilter, pEnumPins, pPin) /
{CComPtr<IEnumPins> pEnumPins; /
 if(pBaseFilter && SUCCEEDED(pBaseFilter->EnumPins(&pEnumPins))) /
{ /
 for(CComPtr<IPin> pPin; S_OK == pEnumPins->Next(1, &pPin, 0); pPin = NULL) /
{ /

#define EndEnumPins }}}
IBaseFilter * CDXTool::GetHeadFilter(IBaseFilter * inSrcFilter)
{
 IBaseFilter * infilter = inSrcFilter;
 IBaseFilter * UpFilter = NULL;
 while(infilter)
 {
  UpFilter = GetUpFilter(infilter);
  if(UpFilter == NULL)
  {
   return infilter;
  }
  FILTER_INFO fi;
  USES_CONVERSION;
  UpFilter->QueryFilterInfo(&fi);
  char * pt = W2A(fi.achName);
  SAFE_RELEASE(fi.pGraph);
  if(infilter && (infilter!=inSrcFilter))
   SAFE_RELEASE(infilter);
  infilter = UpFilter;
 }
 SAFE_RELEASE(UpFilter);
 return NULL;
}

void CDXTool::NukeDownstream(IBaseFilter* pBF, IFilterGraph* pFG)
{
 if(!pBF) return;

 BeginEnumPins(pBF, pEP, pPin)
 {
  CComPtr<IPin> pPinTo;
  CPinInfo pi;
  if(SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo
   && SUCCEEDED(pPinTo->QueryPinInfo(&pi)))
  {
   if(pi.dir == PINDIR_INPUT)
   {
    NukeDownstream(pi.pFilter, pFG);
    pFG->Disconnect(pPinTo);
    pFG->Disconnect(pPin);
    pFG->RemoveFilter(pi.pFilter);
   }
  }
 }
 EndEnumPins
}

IBaseFilter* CDXTool::GetUpFilter(IBaseFilter * inSrcFilter)
{
 IEnumPins * pinEnum = 0;
 IBaseFilter * BaseFilter = NULL;
 if (SUCCEEDED(inSrcFilter->EnumPins(&pinEnum)))
 {
  pinEnum->Reset();
  IPin * pin = 0;
  ULONG cFetched = 0;
  int i = 0;
  while (SUCCEEDED(pinEnum->Next(1, &pin, &cFetched)))
  {
   PIN_INFO pininfo = {0};

   PIN_DIRECTION pinDir;
   if(cFetched == 0)
    break;
   if(cFetched && pin)
   {
    i++;
    pin->QueryDirection(&pinDir);
    if(pinDir == PINDIR_INPUT)
    {
     IPin * connectedPin = 0;
     if(SUCCEEDED(pin->ConnectedTo(&connectedPin)))
     {
      if(SUCCEEDED(connectedPin->QueryPinInfo(&pininfo)))
      {
       BaseFilter = pininfo.pFilter;
       SAFE_RELEASE(connectedPin);
       SAFE_RELEASE(pin);
       break;
      }
      SAFE_RELEASE(pininfo.pFilter);
      SAFE_RELEASE(connectedPin);
     }
    }
   }
   SAFE_RELEASE(pin);
  }
  SAFE_RELEASE(pinEnum);
 }
 return BaseFilter;
}

//注 部分函数来源自开源工程 mpc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值