void DSManager::initCaptureDevices() { HRESULT ret = 0; VARIANT name; ICreateDevEnum* devEnum = NULL; IEnumMoniker* monikerEnum = NULL; IMoniker* moniker = NULL; if(m_devices.size() > 0) { /* clean up our list in case of reinitialization */ for(std::list<DSCaptureDevice*>::iterator it = m_devices.begin() ; it != m_devices.end() ; ++it) { delete *it; } m_devices.clear(); } /* get the available devices list */ ret = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&devEnum); if(FAILED(ret)) { return; } ret = devEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &monikerEnum, 0); /* error or no devices */ if(FAILED(ret) || ret == S_FALSE) { devEnum->Release(); return; } /* loop and initialize all available capture devices */ while(monikerEnum->Next(1, &moniker, 0) == S_OK) { DSCaptureDevice* captureDevice = NULL; IPropertyBag* propertyBag = NULL; { IBaseFilter* cp = NULL; if(!FAILED(moniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&cp))) { IAMVfwCaptureDialogs* vfw = NULL; if(!FAILED( cp->QueryInterface(IID_IAMVfwCaptureDialogs, (void**)&vfw))) { if(vfw) { vfw->Release(); cp->Release(); continue; } } } } /* get properties of the device */ ret = moniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&propertyBag); if(!FAILED(ret)) { VariantInit(&name); ret = propertyBag->Read(L"FriendlyName", &name, 0); if(FAILED(ret)) { VariantClear(&name); propertyBag->Release(); moniker->Release(); continue; } /* create a new capture device */ captureDevice = new DSCaptureDevice(name.bstrVal); /* wprintf(L"%ws\n", name.bstrVal); */ if(captureDevice && captureDevice->initDevice(moniker)) { /* initialization success, add to the list */ m_devices.push_back(captureDevice); } else { /* printf("failed to initialize device\n"); */ delete captureDevice; } /* clean up */ VariantClear(&name); propertyBag->Release(); } moniker->Release(); } /* cleanup */ monikerEnum->Release(); devEnum->Release(); }