我参考<directshow开发指南>第五章 SimplePlayer的源码,自己写了测试程序但是创建组件始终失败bool CDXGraph::Create()
{
//创建一个Filter Graph Manager组件
if(!pGraph)
{
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
if(SUCCEEDED(hr))
{
AddToObjectTable(); return QueryInterfaces();
}
pGraph=0;
}
return false;
}调试发现CoCreateInstance创建始终失败,而且组件已经在APP中注册过了
这是为什么啊
{
//创建一个Filter Graph Manager组件
if(!pGraph)
{
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
if(SUCCEEDED(hr))
{
AddToObjectTable(); return QueryInterfaces();
}
pGraph=0;
}
return false;
}调试发现CoCreateInstance创建始终失败,而且组件已经在APP中注册过了
这是为什么啊
解决方案 »
- MFC下的CSocket接收数据的问题。
- 看了这么长时间的VC,可是面向对象编程的思想,还是没有,还是想着C语言的那种按部就班的编程,希望各位前辈提供点建议意见。
- 急,用树型控件实现单文档多视图选择问题?????
- 请问如何让CMainFrame接收ID_FILE_NEW消息
- 如何获得打印机信息
- 有谁知道.dat是什么文件?用什么应用程序可以打开浏览?
- 关于DirectShow的问题,希望哪位师兄指点一下!
- 100分求<<inside ole2>>的源码
- 退出程序没有退出调试
- 怎样做帮助?
- [求助]DirectX编写程序Debug版正常,改成Release版 有N多错误
- 关于解压缩工具,请高手指点下,
HRESULT hr;
//创建GraphBuilder和CaptureGraphBuilder Filter
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) & pGraph);
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **) & pCapture);
hr = pCapture->SetFiltergraph(pGraph);
// 获得pGraph的IMediaControl,和IVideoWindow
hr = pGraph->QueryInterface(IID_IMediaControl, (LPVOID *) & pMC);
hr = pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) & pVW); IBaseFilter* pSrcFilter = NULL;
IMoniker* pMoniker = NULL;
ICreateDevEnum* pDevEnum = NULL;
IEnumMoniker* pClassEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **) & pDevEnum);
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
for (unsigned int i = 0; i < 1; i++)
{
hr = pClassEnum->Next(1, &pMoniker, NULL);
}
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **) & pSrcFilter);
hr = pGraph->AddFilter(pSrcFilter, L"Video Capture"); pMoniker->Release();
pDevEnum->Release();
pClassEnum->Release();
pSrcFilter->Release(); hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,IID_IBaseFilter, (void**) & pGrabberFilter);
hr = pGraph->AddFilter(pGrabberFilter, L"Sample Grabber");
pGrabberFilter->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber); //设置sampler grabber的媒体类型
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = pGrabber->SetMediaType(&mt); //设置sampler grabber的工作方式
hr = pGrabber->SetOneShot(FALSE);
hr = pGrabber->SetBufferSamples(TRUE); //通过自动连接串联Filter
hr = pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,pSrcFilter, pGrabberFilter, NULL); hr = pVW->put_Owner((OAHWND)m_PreviewPanel.m_hWnd);
hr = pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
// Make the preview video fill our window
RECT rc;
m_PreviewPanel.GetWindowRect(&rc);
pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);
// Make the video window visible, now that it is properly positioned
hr = pVW->put_Visible(OATRUE);
pMC->Run();