我参考<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中注册过了
这是为什么啊

解决方案 »

  1.   

    觉得那本书写得复杂,让人花时间去找参数传递贴出错信息吧这里有个摄像头的创建,希望可以参考
    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();