您的位置:首页 > 其它

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

2006-04-25 09:43 459 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐