DirectShow 24.11.2015// Benutzung: CoInitialize(NULL); IBaseFilter *pFilter; HRESULT hr = getFilter("DirectShow Filters", "MPEG Layer-3 Decoder" , &pFilter); if(SUCCEEDED(hr)) { // do something with the Filter // ... pFilter->Release(); } CoUninitialize(); HRESULT getFilter(CString category, CString name, IBaseFilter **ppFilter) { // Erster Teil: Kategorie suchen *ppFilter=NULL; HRESULT hr; ICreateDevEnum *pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pSysDevEnum); if(FAILED(hr)) return hr; IEnumMoniker *pEnumCat = NULL; hr=pSysDevEnum->CreateClassEnumerator(CLSID_ActiveMovieCategories, &pEnumCat, 0); if(FAILED(hr)) { pSysDevEnum->Release(); return hr; } IMoniker *pMoniker=NULL; ULONG cFetched; IPropertyBag *pPropBag=NULL; CLSID* pclsid = new CLSID(); bool found=false; VARIANT var; VariantInit(&var); while(true) { hr = pEnumCat->Next(1, &pMoniker, &cFetched); if(FAILED(hr)) break; // Fehler if(hr==S_FALSE) break; // die Enum hat keine Elemente mehr /////////////// die gewünschte Kategorie finden und clsid bilden /////////////////// hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,(void **)&pPropBag); if(FAILED(hr)) continue; hr = pPropBag->Read(L"FriendlyName", &var, 0); if(FAILED(hr)) continue; CString strFriendlyName(var.bstrVal); if(strFriendlyName.Find(category)==-1) // weiter suchen continue; // die gewünschte kategorie ist nun gefunden hr = pPropBag->Read(L"CLSID", &var, 0); if(FAILED(hr)) break; CString strCLSID(var.bstrVal); hr = CLSIDFromString(var.bstrVal,pclsid); if(FAILED(hr)) break; found=true; break; } if(pPropBag) { pPropBag->Release(); pPropBag=NULL; } if(pMoniker) { pMoniker->Release(); pMoniker=NULL; } if(pEnumCat) { pEnumCat->Release(); pEnumCat=NULL; } if(pSysDevEnum) { pSysDevEnum->Release(); pSysDevEnum=NULL; } VariantClear(&var); if(FAILED(hr)) { delete pclsid; return hr; } if(!found) { delete pclsid; return S_FALSE; } // Zweiter Teil: Filter suchen hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pSysDevEnum); if(FAILED(hr)) { delete pclsid; return hr; } hr=pSysDevEnum->CreateClassEnumerator(*pclsid, &pEnumCat, 0); if(FAILED(hr)) { pSysDevEnum->Release(); delete pclsid; return hr; } found=false; VariantInit(&var); while(true) { hr = pEnumCat->Next(1, &pMoniker, &cFetched); if(FAILED(hr)) break; // Fehler if(hr==S_FALSE) break; // die Enum hat keine Elemente mehr hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,(void **)&pPropBag); if(FAILED(hr)) continue; hr = pPropBag->Read(L"FriendlyName", &var, 0); if(FAILED(hr)) continue; CString strFriendlyName(var.bstrVal); if(strFriendlyName.Find(name)==-1) // weiter suchen continue; // der gewünschte filter ist nun gefunden hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)ppFilter); if(FAILED(hr)) break; found=true; break; } if(pPropBag) { pPropBag->Release(); pPropBag=NULL; } if(pMoniker) { pMoniker->Release(); pMoniker=NULL; } if(pEnumCat) { pEnumCat->Release(); pEnumCat=NULL; } if(pSysDevEnum) { pSysDevEnum->Release(); pSysDevEnum=NULL; } delete pclsid; VariantClear(&var); if(FAILED(hr))return hr; if(!found) return S_FALSE; // keinen passenden Filter gefunden return S_OK; }