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
验证此现象的代码:
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
相关文章推荐
- [转]在IE7关闭窗口,上传图片无法预览,window.status无效问题解决办法
- [转]在IE7关闭窗口,上传图片无法预览,window.status无效问题解决办法
- 在IE7关闭窗口,上传图片无法预览,window.status无效问题解决办法
- 在IE7/IE8 关闭窗口,上传图片无法预览,window.status无效问题解决办法
- 在IE7关闭窗口,上传图片无法预览,window.status无效问题解决办法
- 解决VS控制台窗口自动关闭的问题
- javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
- 解决SetForegroundWindow和BringWindowToTop等函数有时失败,无法将窗口带到前台的问题
- VB.NET关闭窗体时最小化(附带解决.NET程序导致XP无法关机重启的问题)
- 解决: ctrl+shift 快速切换输入法导致自动关闭当前打开的任何窗口的问题
- VC++6.0无法打开文件的解决办法(一点打开窗口就自动关闭了)
- 火狐下无法用window.close关闭窗口解决
- 解决新版谷歌浏览器无法关闭窗口的问题
- 解决无法关闭IE中alert()或者confirm弹出窗口的问题
- 解决Firefox中有时使用window.close()脚本无法关闭当前窗口的方法
- video标签在安卓webview下无法自动播放问题的解决方法
- javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
- window.close()在FF下无法关闭的问题解决
- window.close()自动关闭窗口时提示的解决
- window.open 打开的子窗口 闪一下即自动关闭问题