Hi,
大家猴年好!
请问计算机中设备(如USB摄像头)的interface class GUID是什么概念呢?如何用程式或者注册表查询取得其interface class GUID?
谢谢!

解决方案 »

  1.   


    从前做的一个通过USB视频采集 自己看看吧void TFormMain::CreatVideo()
    {
        IEnumPins **ppEnum;
    //初始化,视频操作必须首先初始化
        CoInitialize(NULL);
    //获得所有设备列表pDevEnum
        ICreateDevEnum  *pDevEnum =NULL;//所有系统设备列表
        hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);
    //从所有设备中找到视频设备
        IEnumMoniker *pClassEnum = NULL;//视频类设备列表
        hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClassEnum, 0);
    //通过视频设备列表pClassEnum获得所有视频设备的Moniker,
    //并获得视频设备个数g_Total
        IMoniker *pMoniker=NULL;//用来查找视频的中间值
        g_Total=0;//视频设备个数
        if(pClassEnum==NULL)
        {//没有视频设备
            ShowMessage("未安装视频设备");
            pDevEnum->Release();
            return;
        }
        IMoniker *g_pVideoMoniker[10];
        while (hr = pClassEnum->Next(1, &pMoniker, &cFetched), hr == S_OK)
    {
    g_pVideoMoniker[g_Total] = pMoniker;
            g_Total++;
    }
        if(g_Total<2)
        {
            ShowMessage("只有一个摄像头");
            pDevEnum->Release();
            pClassEnum->Release();
            g_pVideoMoniker[0]->Release();
            g_pVideoMoniker[0] = NULL;
            return;
        }
    //将设备列表空间释放
        pDevEnum->Release();
    pClassEnum->Release();
    //将视频设备绑定到过滤器上
        IBaseFilter *pSrc0 = NULL;//基础过滤器
        IBaseFilter *pSrc1 = NULL;//基础过滤器
        if(g_Total>1)//设备0
        {
         hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0);
          hr = g_pVideoMoniker[1]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc1);
            g_pVideoMoniker[0]->Release();
            g_pVideoMoniker[0] = NULL;
            g_pVideoMoniker[1]->Release();
            g_pVideoMoniker[1] = NULL;
        }
        else if(g_Total==1)
        {
          hr = g_pVideoMoniker[0]->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc0);
            ShowMessage("当前只安装了一个视频设备");
            g_pVideoMoniker[0]->Release();
            g_pVideoMoniker[0] = NULL;
        }//创建视频窗
        g_pGraph0 = NULL;//过滤图
        g_pGraph1 = NULL;//过滤图
        hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
    IID_IGraphBuilder, (void **) &g_pGraph0);
        hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
    IID_IGraphBuilder, (void **) &g_pGraph1);
    //创建捕获窗
        g_pCapture0 = NULL;
        g_pCapture1 = NULL;
        hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
    IID_ICaptureGraphBuilder2, (void **) &g_pCapture0);
        hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
    IID_ICaptureGraphBuilder2, (void **) &g_pCapture1);
    //视频窗的媒体控制参数
        IVideoWindow  * g_pVW0 = NULL;
        IMediaControl * g_pMC0 = NULL;
        IVideoWindow  * g_pVW1 = NULL;
        IMediaControl * g_pMC1 = NULL;    g_pGraph0->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC0);
    g_pGraph0->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW0);
        g_pGraph1->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC1);
    g_pGraph1->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW1);
    //将捕获窗的视频属性设为定义好的视频窗
        g_pCapture0->SetFiltergraph(g_pGraph0);
        g_pCapture1->SetFiltergraph(g_pGraph1);
    //创建采样捕获过滤器
        IBaseFilter *pF0 = NULL;//采样捕获过滤器
        IBaseFilter *pF1 = NULL;//采样捕获过滤器
    hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
    IID_IBaseFilter, (LPVOID *)&pF0);
    hr = CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
    IID_IBaseFilter, (LPVOID *)&pF1);    pGrab0 = NULL;
        pGrab1 = NULL; hr = pF0->QueryInterface( IID_ISampleGrabber, (void **)&pGrab0);
    hr = pF1->QueryInterface( IID_ISampleGrabber, (void **)&pGrab1);    pF0->Release();
        pF1->Release();//设定视频格式
    //    AM_MEDIA_TYPE   amt0;
    //    AM_MEDIA_TYPE   amt1;
    memset(&amt0,0, sizeof(AM_MEDIA_TYPE));
    amt0.majortype  = MEDIATYPE_Video;
    amt0.subtype    = MEDIASUBTYPE_RGB24;
    amt0.formattype = FORMAT_VideoInfo;
    pGrab0 -> SetMediaType(&amt0);
    memset(&amt1, 0,sizeof(AM_MEDIA_TYPE));
    amt1.majortype  = MEDIATYPE_Video;
    amt1.subtype    = MEDIASUBTYPE_RGB24;
    amt1.formattype = FORMAT_VideoInfo;
    pGrab1 -> SetMediaType(&amt1);
    //设定视频窗的视频格式
    hr = g_pGraph0->AddFilter(pF0, L"Sample Grabber");
    hr = g_pGraph1->AddFilter(pF1, L"Sample Grabber");
    // 将过滤器加到视频窗中.
        hr = g_pGraph0->AddFilter(pSrc0, L"Video Capture");
    if(g_Total>1)
        hr = g_pGraph1->AddFilter(pSrc1, L"Video Capture");
    // Render the preview pin on the video capture filter
    // 捕获窗与过滤器pSrc连接
        hr = g_pCapture0->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
    pSrc0, NULL, NULL);
    if(g_Total>1)
        hr = g_pCapture1->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
        pSrc1, NULL, NULL);    pSrc0->Release();//释放过滤器
        pSrc0 = NULL;
    if(g_Total>1)
    {
        pSrc1->Release();//释放过滤器
        pSrc1 = NULL;
    }    g_pVW0->put_Owner((OAHWND)Panel2->Handle);
        g_pVW0->Release();
        g_pVW0 = NULL;
        g_pVW1->put_Owner((OAHWND)Panel2->Handle);
        g_pVW1->Release();
        g_pVW1 = NULL;
    //将视频显示到窗体上
        //创建一个窗体
    /*
        g_hwnd0 = capCreateCaptureWindow (
            (LPSTR) "My Capture Window0", // window name if pop-up
            WS_CHILD ,      // window style | WS_VISIBLE
            200, 40, 280, 280,              // window position and dimensions
            (HWND) Handle,
            0   );//child ID
        g_hwnd1 = capCreateCaptureWindow (
            (LPSTR) "My Capture Window1", // window name if pop-up
            WS_CHILD ,      // window style | WS_VISIBLE
            600, 40, 280, 280,              // window position and dimensions
            (HWND) Handle,
            0   );//child ID    //视频显示于该窗体
    g_pVW0->put_Owner((OAHWND)g_hwnd0);
        g_pVW0->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
        g_pVW0->put_Height(280);
        g_pVW0->put_Width(280);
    g_pVW1->put_Owner((OAHWND)g_hwnd1);
        g_pVW1->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
        g_pVW1->put_Height(280);
        g_pVW1->put_Width(280);    //获得创建窗体的大小,并将视频尺寸设定得与其一致
    RECT grc;
    ::GetClientRect(g_hwnd0, &grc);
    g_pVW0->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);
    ::GetClientRect(g_hwnd1, &grc);
    g_pVW1->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);
    */
    // 开始预览视频
    hr = g_pMC0->Run();
    hr = pGrab0->SetBufferSamples(TRUE); //设置采样缓存
    hr = g_pMC1->Run();
    hr = pGrab1->SetBufferSamples(TRUE); //设置采样缓存    g_pMC0->Release();
        g_pMC1->Release();}