BOOL IsExcelThere() { IRunningObjectTable *pRot = NULL; ::GetRunningObjectTable(0, &pRot); IEnumMoniker *pEnum = NULL; pRot->EnumRunning(&pEnum); IMoniker* pMon[1] = { NULL }; ULONG fetched = 0; BOOL found = FALSE; while (pEnum->Next(1, pMon, &fetched) == 0) { IUnknown *pUnknown; pRot->GetObject(pMon[0], &pUnknown); IUnknown *pWorkbook; if (SUCCEEDED(pUnknown->QueryInterface(DIID__Workbook, (void **) &pWorkbook))) { found = TRUE; pWorkbook->Release(); break; } pUnknown->Release(); } if (pRot != NULL) pRot->Release(); if (pEnum != NULL) pEnum->Release(); return found; }
void DirectShowAudioEndpointControl::updateEndpoints() { IMalloc *oleMalloc = 0; if (m_deviceEnumerator && CoGetMalloc(1, &oleMalloc) == S_OK) { IEnumMoniker *monikers = 0; if (m_deviceEnumerator->CreateClassEnumerator( CLSID_AudioRendererCategory, &monikers, 0) == S_OK) { for (IMoniker *moniker = 0; monikers->Next(1, &moniker, 0) == S_OK; moniker->Release()) { OLECHAR *string = 0; if (moniker->GetDisplayName(m_bindContext, 0, &string) == S_OK) { QString deviceId = QString::fromWCharArray(string); oleMalloc->Free(string); moniker->AddRef(); m_devices.insert(deviceId, moniker); if (m_defaultEndpoint.isEmpty() || deviceId.endsWith(QLatin1String("Default DirectSound Device"))) { m_defaultEndpoint = deviceId; } } } monikers->Release(); } oleMalloc->Release(); } }
HRESULT VideoCapture::FindCaptureDevice(const wchar_t* deviceName, IBaseFilter** ppSrcFilter) { ICreateDevEnum *pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum); if (FAILED(hr)) return hr; // Obtain a class enumerator for the video input devices category. IEnumMoniker *pEnumCat = NULL; hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0); if (hr == S_OK) { // Enumerate the monikers. IMoniker *pMoniker = NULL; ULONG cFetched; while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if (SUCCEEDED(hr)) { // To retrieve the filter's friendly name VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, 0); if (SUCCEEDED(hr)) { if (wcscmp(deviceName, varName.bstrVal) == 0) { m_DeviceName = varName.bstrVal; VariantClear(&varName); IBaseFilter* pFilter; hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter); if (SUCCEEDED(hr)) { *ppSrcFilter = pFilter; (*ppSrcFilter)->AddRef(); pFilter->Release(); } pPropBag->Release(); pMoniker->Release(); pEnumCat->Release(); pSysDevEnum->Release(); return hr; } } VariantClear(&varName); pPropBag->Release(); } pMoniker->Release(); } pEnumCat->Release(); } else { pSysDevEnum->Release(); return hr; } pSysDevEnum->Release(); return -1; }
///////////////////////////////////////////////////////////////////////////////////////// // DirectShowキャプチャデバイスの取得と列挙 ///////////////////////////////////////////////////////////////////////////////////////// BOOL GetCaptureDevice(IBaseFilter **ppSrcFilter) { HRESULT hResult; // デバイスを列挙する ICreateDevEnum *pDevEnum = NULL; hResult = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pDevEnum); if (hResult != S_OK)return FALSE; // 列挙したデバイスの一番目をデバイスとして取得する IEnumMoniker *pClassEnum = NULL; hResult = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0); if (hResult != S_OK)return FALSE; // デバイスをフィルタに接続する ULONG cFetched; IMoniker *pMoniker = NULL; if (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK){ // 最初のモニカをフィルタオブジェクトにバインドする pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)ppSrcFilter); pMoniker->Release(); }else return FALSE; // グラフビルダに追加する hResult = g_pGraph->AddFilter(g_pSrc, L"Video Capture"); if (hResult != S_OK)return FALSE; // オブジェクトの片づけ pClassEnum->Release(); pDevEnum->Release(); return TRUE; }
QList<QByteArray> QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) { Q_UNUSED(mode) QList<QByteArray> devices; //enumerate device fullnames through directshow api CoInitialize(NULL); ICreateDevEnum *pDevEnum = NULL; IEnumMoniker *pEnum = NULL; // Create the System device enumerator HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void **>(&pDevEnum)); unsigned long iNumDevs = mode == QAudio::AudioOutput ? waveOutGetNumDevs() : waveInGetNumDevs(); if (SUCCEEDED(hr)) { // Create the enumerator for the audio input/output category if (pDevEnum->CreateClassEnumerator( mode == QAudio::AudioOutput ? CLSID_AudioRendererCategory : CLSID_AudioInputDeviceCategory, &pEnum, 0) == S_OK) { pEnum->Reset(); // go through and find all audio devices IMoniker *pMoniker = NULL; while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag, reinterpret_cast<void **>(&pPropBag)); if (FAILED(hr)) { pMoniker->Release(); continue; // skip this one } // Find if it is a wave device VARIANT var; VariantInit(&var); hr = pPropBag->Read(mode == QAudio::AudioOutput ? L"WaveOutID" : L"WaveInID", &var, 0); if (SUCCEEDED(hr)) { LONG waveID = var.lVal; if (waveID >= 0 && waveID < LONG(iNumDevs)) { VariantClear(&var); // Find the description hr = pPropBag->Read(L"FriendlyName", &var, 0); if (SUCCEEDED(hr)) { QByteArray device; QDataStream ds(&device, QIODevice::WriteOnly); ds << quint32(waveID) << QString::fromWCharArray(var.bstrVal); devices.append(device); } } } pPropBag->Release(); pMoniker->Release(); } } } CoUninitialize(); return devices; }
int Camera::EnumDevices(PENUMDEVICE pCallback, void* pItem) { int nDevice = 0; HRESULT hr = S_OK; // System device enumerators ICreateDevEnum *pDevEnum = NULL; IEnumMoniker *pEnum = NULL; IMoniker *pMoniker = NULL; CoInitialize(NULL); // Create system device enumerator hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum) ); if (FAILED(hr)) { return 0; } // create enumerator for video capture devices hr = pDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &pEnum, 0 ); if (SUCCEEDED(hr)) { IBindCtx* pbcfull = NULL; // Enumerate through the devices and print friendly name while ( (pEnum->Next( 1, &pMoniker, NULL ) == S_OK)) { VARIANT var; IPropertyBag *pPropertyBag; char szCameraName[200]; // FrienlyName : The name of the device var.vt = VT_BSTR; // Bind to IPropertyBag pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropertyBag); // Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/dd377566(v=vs.85).aspx hr = pPropertyBag->Read(L"Description", &var, 0); // "FriendlyName", "DevicePath", "Description" if (FAILED(hr)) { pPropertyBag->Read(L"FriendlyName", &var, 0); } WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1,szCameraName, sizeof(szCameraName), 0, 0); if (pCallback != NULL) { (*pCallback)(pItem, szCameraName); } VariantClear(&var); // Release resource pPropertyBag->Release(); nDevice++; SAFE_RELEASE( pMoniker ); } } return nDevice; // returns count of camera }
void FaceTrackNoIR::GetCameraNameDX() { #if defined(_WIN32) ui.cameraName->setText("No video-capturing device was found in your system: check if it's connected!"); // Create the System Device Enumerator. HRESULT hr; ICreateDevEnum *pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum); if (FAILED(hr)) { qDebug() << "GetWDM says: CoCreateInstance Failed!"; return; } qDebug() << "GetWDM says: CoCreateInstance succeeded!"; // Obtain a class enumerator for the video compressor category. IEnumMoniker *pEnumCat = NULL; hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0); if (hr == S_OK) { qDebug() << "GetWDM says: CreateClassEnumerator succeeded!"; IMoniker *pMoniker = NULL; ULONG cFetched; if (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if (SUCCEEDED(hr)) { VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, 0); if (SUCCEEDED(hr)) { QString str((QChar*)varName.bstrVal, wcslen(varName.bstrVal)); qDebug() << "GetWDM says: Moniker found:" << str; ui.cameraName->setText(str); } VariantClear(&varName); pPropBag->Release(); } pMoniker->Release(); } pEnumCat->Release(); } pSysDevEnum->Release(); #else for (int i = 0; i < 16; i++) { char buf[128]; sprintf(buf, "/dev/video%d", i); if (access(buf, R_OK | W_OK) == 0) { ui.cameraName->setText(QString(buf)); break; } } #endif }
// Used (by getDeviceModes) to select a device // so we can list its properties static IBaseFilter* getDevFilter(QString devName) { IBaseFilter* devFilter = nullptr; devName = devName.mid(6); // Remove the "video=" IMoniker* m = nullptr; ICreateDevEnum* devenum = nullptr; if (CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**) &devenum) != S_OK) return devFilter; IEnumMoniker* classenum = nullptr; if (devenum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, (IEnumMoniker**)&classenum, 0) != S_OK) return devFilter; while (classenum->Next(1, &m, nullptr) == S_OK) { LPMALLOC coMalloc = nullptr; IBindCtx* bindCtx = nullptr; LPOLESTR olestr = nullptr; char* devIdString; if (CoGetMalloc(1, &coMalloc) != S_OK) goto fail; if (CreateBindCtx(0, &bindCtx) != S_OK) goto fail; if (m->GetDisplayName(bindCtx, nullptr, &olestr) != S_OK) goto fail; devIdString = wcharToUtf8(olestr); // replace ':' with '_' since FFmpeg uses : to delimitate sources for (unsigned i = 0; i < strlen(devIdString); i++) if (devIdString[i] == ':') devIdString[i] = '_'; if (devName != devIdString) goto fail; if (m->BindToObject(0, 0, IID_IBaseFilter, (void**)&devFilter) != S_OK) goto fail; fail: if (olestr && coMalloc) coMalloc->Free(olestr); if (bindCtx) bindCtx->Release(); delete[] devIdString; m->Release(); } classenum->Release(); if (!devFilter) qWarning() << "Could't find the device "<<devName; return devFilter; }
QT_BEGIN_NAMESPACE DSVideoDeviceControl::DSVideoDeviceControl(QObject *parent) : QVideoDeviceControl(parent) { m_session = qobject_cast<DSCameraSession*>(parent); devices.clear(); descriptions.clear(); CoInitialize(NULL); ICreateDevEnum* pDevEnum = NULL; IEnumMoniker* pEnum = NULL; // Create the System device enumerator HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum)); if(SUCCEEDED(hr)) { // Create the enumerator for the video capture category hr = pDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &pEnum, 0); if (S_OK == hr) { pEnum->Reset(); // go through and find all video capture devices IMoniker* pMoniker = NULL; while(pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag)); if(FAILED(hr)) { pMoniker->Release(); continue; // skip this one } // Find the description WCHAR str[120]; VARIANT varName; varName.vt = VT_BSTR; hr = pPropBag->Read(L"FriendlyName", &varName, 0); if(SUCCEEDED(hr)) { wcsncpy(str, varName.bstrVal, sizeof(str)/sizeof(str[0])); QString temp(QString::fromUtf16((unsigned short*)str)); devices.append(QString("ds:%1").arg(temp).toLocal8Bit().constData()); hr = pPropBag->Read(L"Description", &varName, 0); wcsncpy(str, varName.bstrVal, sizeof(str)/sizeof(str[0])); QString temp2(QString::fromUtf16((unsigned short*)str)); descriptions.append(temp2.toLocal8Bit().constData()); } pPropBag->Release(); pMoniker->Release(); } pEnum->Release(); } pDevEnum->Release(); } CoUninitialize(); selected = 0; }
bool MIPDirectShowCapture::getCaptureDevice(int deviceNumber) { ICreateDevEnum *pDevEnum = 0; IEnumMoniker *pEnum = 0; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)(&pDevEnum)); if (HR_FAILED(hr)) { setErrorString(MIPDIRECTSHOWCAPTURE_ERRSTR_CANTCREATEDEVICEENUMERATOR); return false; } hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); if (HR_FAILED(hr)) { pDevEnum->Release(); setErrorString(MIPDIRECTSHOWCAPTURE_ERRSTR_CANTCAPTUREENUMERATOR); return false; } if (pEnum == 0) { pDevEnum->Release(); setErrorString(MIPDIRECTSHOWCAPTURE_ERRSTR_CANTFINDCAPTUREDEVICE); return false; } IMoniker *pMoniker = NULL; while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { if (deviceNumber == 0) { hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_pCaptDevice); pMoniker->Release(); if (HR_SUCCEEDED(hr)) { pEnum->Release(); pDevEnum->Release(); return true; } else { m_pCaptDevice = 0; pEnum->Release(); pDevEnum->Release(); setErrorString(MIPDIRECTSHOWCAPTURE_ERRSTR_CANTBINDCAPTUREDEVICE); return false; } } else deviceNumber--; } pEnum->Release(); pDevEnum->Release(); setErrorString(MIPDIRECTSHOWCAPTURE_ERRSTR_CANTFINDCAPTUREDEVICE); return false; }
void DSServicePlugin::updateDevices() const { m_cameraDevices.clear(); m_cameraDescriptions.clear(); BOOL bFound = TRUE; CoInitialize(NULL); ICreateDevEnum* pDevEnum = NULL; IEnumMoniker* pEnum = NULL; // Create the System device enumerator HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum)); if(SUCCEEDED(hr)) { // Create the enumerator for the video capture category hr = pDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &pEnum, 0); if (S_OK == hr) { pEnum->Reset(); // go through and find all video capture devices IMoniker* pMoniker = NULL; while(pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag, (void**)(&pPropBag)); if(FAILED(hr)) { pMoniker->Release(); continue; // skip this one } bFound = TRUE; // Find the description WCHAR str[120]; VARIANT varName; varName.vt = VT_BSTR; hr = pPropBag->Read(L"FriendlyName", &varName, 0); if(SUCCEEDED(hr)) { wcsncpy(str, varName.bstrVal, sizeof(str)/sizeof(str[0])); QString temp(QString::fromUtf16((unsigned short*)str)); m_cameraDevices.append(QString("ds:%1").arg(temp).toLocal8Bit().constData()); hr = pPropBag->Read(L"Description", &varName, 0); wcsncpy(str, varName.bstrVal, sizeof(str)/sizeof(str[0])); QString temp2(QString::fromUtf16((unsigned short*)str)); m_cameraDescriptions.append(temp2); } else { qWarning() << "No friendly name"; } pPropBag->Release(); pMoniker->Release(); } pEnum->Release(); } pDevEnum->Release(); } CoUninitialize(); if (!bFound) { qWarning() << "No camera devices found"; } }
/** Accesses the correct visual studio instance if possible. */ bool AccessVisualStudio(CComPtr<EnvDTE::_DTE>& OutDTE, const FString& InSolutionPath, const TArray<FVSAccessorModule::VisualStudioLocation>& InLocations) { bool bSuccess = false; // Open the Running Object Table (ROT) IRunningObjectTable* RunningObjectTable; if (SUCCEEDED(GetRunningObjectTable(0, &RunningObjectTable)) && RunningObjectTable) { IEnumMoniker* MonikersTable; RunningObjectTable->EnumRunning(&MonikersTable); MonikersTable->Reset(); // Look for all visual studio instances in the ROT IMoniker* CurrentMoniker; while (!bSuccess && MonikersTable->Next(1, &CurrentMoniker, NULL) == S_OK) { IBindCtx* BindContext; LPOLESTR OutName; CComPtr<IUnknown> ComObject; if (SUCCEEDED(CreateBindCtx(0, &BindContext)) && SUCCEEDED(CurrentMoniker->GetDisplayName(BindContext, NULL, &OutName)) && IsVisualStudioMoniker(FString(OutName), InLocations) && SUCCEEDED(RunningObjectTable->GetObject(CurrentMoniker, &ComObject))) { CComPtr<EnvDTE::_DTE> TempDTE; TempDTE = ComObject; // Get the solution path for this instance // If it equals the solution we would have opened above in RunVisualStudio(), we'll take that CComPtr<EnvDTE::_Solution> Solution; LPOLESTR OutPath; if (SUCCEEDED(TempDTE->get_Solution(&Solution)) && SUCCEEDED(Solution->get_FullName(&OutPath))) { FString Filename(OutPath); FPaths::NormalizeFilename(Filename); if( Filename == InSolutionPath ) { OutDTE = TempDTE; bSuccess = true; } } } BindContext->Release(); CurrentMoniker->Release(); } MonikersTable->Release(); RunningObjectTable->Release(); } return bSuccess; }
//枚举设备 HRESULT CCaptureDevice::EnumDevices( REFCLSID clsidDeviceClass, ENUMCALLBACK pEnumCallBack, LPVOID lp ) { //创建枚举组件 ICreateDevEnum *pCreateDevEnum; HRESULT hr; VARIANT var; hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum ); if( hr==S_OK ) { //创建枚举器 IEnumMoniker* pEm; hr = pCreateDevEnum->CreateClassEnumerator( clsidDeviceClass, &pEm, 0 ); if( hr==S_OK ) { if( pEm ) { //复位 pEm->Reset(); //准备顺序找设备 ULONG cFetched; IMoniker *pM; BOOL bCancel = false; int index = 0; while( !bCancel && (hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) ) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(hr==S_OK) { ZeroMemory( &var, sizeof(var) ); var.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var, NULL); if(hr==S_OK && var.bstrVal!=0 ) { if(pEnumCallBack) hr = pEnumCallBack( index, &var, pM, lp, bCancel ); SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); index++; } //释放 pEm->Release(); } } pCreateDevEnum->Release(); } return hr; }
bool Captura::EnlazarFiltro(int deviceId, IBaseFilter **pFilter) { if (deviceId < 0) return false; //CComPtr<ICreateDevEnum> pCreateDevEnum; ICreateDevEnum *pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) { return false; } //CComPtr<IEnumMoniker> pEm; IEnumMoniker *pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0); if (hr != NOERROR) { return false; } pEm->Reset(); ULONG cFetched; IMoniker *pM; int index = 0; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var, NULL); if (hr == NOERROR) { if (index == deviceId) { pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter); } SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); index++; } return true; }
// Very basic setup of capture filter, we should do error checking bool DsCaptureFilter::initialize() { IBaseFilter* sourceFilter = NULL; IPin* sourcePin = NULL; HRESULT hr = CoInitialize(0); hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph); hr = graph->QueryInterface(IID_IMediaControl, (void **)&mediaControl); //sampler = new Sampler(0, &hr); IPin* renderPin = NULL; hr = this->FindPin(L"In", &renderPin); hr = graph->AddFilter((IBaseFilter*)this, L"Sampler"); if(strcmp(source, "cam") == 0) // Capture from camera { ICreateDevEnum* devs = NULL; hr = CoCreateInstance (CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs); IEnumMoniker* cams = NULL; hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0; IMoniker* mon = NULL; hr = cams?cams->Next (1, &mon, 0):0; hr = mon?mon->BindToObject(0,0,IID_IBaseFilter, (void**)&sourceFilter):0; hr = graph->AddFilter(sourceFilter, L"Capture Source"); } else // Capture from AVI { WCHAR filename[256]; MultiByteToWideChar(0, 0, source, -1, filename, sizeof(filename)); hr = graph->AddSourceFilter(filename, L"File Source", &sourceFilter); hr = sourceFilter?sourceFilter->FindPin(L"Output", &sourcePin):0; hr = graph?graph->QueryInterface(IID_IMediaEvent, (void **)&mediaEvent):0; hr = graph?graph->QueryInterface(IID_IMediaSeeking, (void **)&mediaSeek):0; } IEnumPins* pins = NULL; hr = sourceFilter?sourceFilter->EnumPins(&pins):0; hr = pins?pins->Next(1,&sourcePin, 0):0; hr = graph->Connect(sourcePin, renderPin); newFrameEvent = CreateEvent(0, FALSE, FALSE, "NewFrameEvent"); return true; }
HRESULT CaptureGraph::GetCaptureFilters(int *filterCount, CListBox *captureFilterList) { HRESULT hr; int maxFilterCount = *filterCount; ICreateDevEnum *pSysVideoCaptureEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysVideoCaptureEnum); if (FAILED(hr)) { return hr; } IBaseFilter *pVideoCapture = NULL; IEnumMoniker *pEnumMoniker = NULL; hr = pSysVideoCaptureEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0); if (hr == S_OK) { IMoniker *pMoniker = NULL; ULONG fetched; int filterIndex = 0; while(pEnumMoniker->Next(1, &pMoniker, &fetched) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if(SUCCEEDED(hr)) { VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, 0); if(SUCCEEDED(hr)) { ASSERT(varName.vt == VT_BSTR); CString friendlyName(varName.bstrVal); VariantClear(&varName); pPropBag->Release(); filterIndex ++; captureFilterList->AddString(friendlyName); int currentFilterIndex = captureFilterList->FindStringExact(-1, friendlyName); captureFilterList->SetItemDataPtr(currentFilterIndex, pMoniker); if(filterIndex > maxFilterCount) { *filterCount = filterIndex; break; } } } } pEnumMoniker->Release(); } pSysVideoCaptureEnum->Release(); }
IFileIsInUse* CreateIFileIsInUse(const string& File) { IFileIsInUse *pfiu = nullptr; IRunningObjectTable *prot; if (SUCCEEDED(GetRunningObjectTable(0, &prot))) { IMoniker *pmkFile; if (SUCCEEDED(CreateFileMoniker(File.data(), &pmkFile))) { IEnumMoniker *penumMk; if (SUCCEEDED(prot->EnumRunning(&penumMk))) { HRESULT hr = E_FAIL; ULONG celt; IMoniker *pmk; while (FAILED(hr) && (penumMk->Next(1, &pmk, &celt) == S_OK)) { DWORD dwType; if (SUCCEEDED(pmk->IsSystemMoniker(&dwType)) && dwType == MKSYS_FILEMONIKER) { IMoniker *pmkPrefix; if (SUCCEEDED(pmkFile->CommonPrefixWith(pmk, &pmkPrefix))) { if (pmkFile->IsEqual(pmkPrefix) == S_OK) { IUnknown *punk; if (prot->GetObject(pmk, &punk) == S_OK) { hr = punk->QueryInterface( #ifdef __GNUC__ IID_IFileIsInUse, IID_PPV_ARGS_Helper(&pfiu) #else IID_PPV_ARGS(&pfiu) #endif ); punk->Release(); } } pmkPrefix->Release(); } } pmk->Release(); } penumMk->Release(); } pmkFile->Release(); } prot->Release(); } return pfiu; }
HRESULT GetCaptureFilter(REFCLSID CLSID_DeviceCategory, LPCTSTR lpFriendlyName, void** ppCapture) { ICreateDevEnum *pCreateDevEnum = 0; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum , NULL , CLSCTX_INPROC_SERVER , IID_ICreateDevEnum , (void**)&pCreateDevEnum); if (FAILED(hr)) return hr; IEnumMoniker* pEnumMoniker = 0; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_DeviceCategory, &pEnumMoniker, 0); if (FAILED(hr)) { pCreateDevEnum->Release(); return hr; } pEnumMoniker->Reset(); BOOL bFound = FALSE; IMoniker* pMoniker = NULL; while ((pEnumMoniker->Next(1, &pMoniker, NULL) == S_OK )&& (!bFound)) { IPropertyBag *pBag = NULL; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if (SUCCEEDED(hr)) { VARIANT var = { 0 }; var.vt = VT_BSTR; hr = pBag->Read(_T("FriendlyName"), &var, NULL); if (SUCCEEDED(hr)) { if (!_tcscmp(var.bstrVal, lpFriendlyName)) { hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)ppCapture); pMoniker->AddRef(); bFound = TRUE; } pBag->Release(); } } pMoniker->Release(); }//end while pEnumMoniker->Release(); pCreateDevEnum->Release(); if (*ppCapture == NULL) return E_FAIL; if (FAILED(hr)) return hr; return bFound ? S_OK : S_FALSE; }
HRESULT CDShowControl::CreateFilter(CString filterName, IBaseFilter **pFilter, FILTER_CATEGORY category) { HRESULT hr; IMoniker *pMoniker; IEnumMoniker *pEnumCat = NULL; ICreateDevEnum *pCreateDevEnum = NULL; ULONG cFetched; VARIANT varName = {0}; RETURNIF(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum)); RETURNIF(pCreateDevEnum->CreateClassEnumerator(*categories[category].pClsid, &pEnumCat, 0)); if (!pEnumCat) { return S_FALSE; } while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&pPropBag); if (FAILED(hr)) continue; varName.vt = VT_BSTR; hr = pPropBag->Read(L"FriendlyName", &varName, 0); if (FAILED(hr)) continue; CString str(varName.bstrVal); SysFreeString(varName.bstrVal); if (str.Find(filterName) != -1 || filterName.Compare(L"") == 0) { hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter); if (SUCCEEDED(hr)) { SAFE_RELEASE(pPropBag); SAFE_RELEASE(pMoniker); pEnumCat->Release(); pCreateDevEnum->Release(); return S_OK; } } SAFE_RELEASE(pPropBag); SAFE_RELEASE(pMoniker); } SAFE_RELEASE(pEnumCat); SAFE_RELEASE(pCreateDevEnum); return S_FALSE; }
// @pymethod <o PyIMoniker>|PyIEnumMoniker|Next|Retrieves a specified number of items in the enumeration sequence. PyObject *PyIEnumMoniker::Next(PyObject *self, PyObject *args) { long celt = 1; // @pyparm int|num|1|Number of items to retrieve. if ( !PyArg_ParseTuple(args, "|l:Next", &celt) ) return NULL; IEnumMoniker *pMy = GetI(self); if (pMy==NULL) return NULL; IMoniker **rgVar = new IMoniker *[celt]; if ( rgVar == NULL ) { PyErr_SetString(PyExc_MemoryError, "allocating result IMoniker *s"); return NULL; } int i; ULONG celtFetched; PY_INTERFACE_PRECALL; HRESULT hr = pMy->Next(celt, rgVar, &celtFetched); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) { delete [] rgVar; return PyCom_BuildPyException(hr); } PyObject *result = PyTuple_New(celtFetched); if ( result != NULL ) { for ( i = celtFetched; i--; ) { PyObject *ob = PyCom_PyObjectFromIUnknown(rgVar[i], IID_IMoniker, FALSE); if ( ob == NULL ) { Py_DECREF(result); result = NULL; break; } PyTuple_SET_ITEM(result, i, ob); } } delete [] rgVar; return result; // @rdesc The result is a tuple of <o PyIID> objects, // one for each element returned. Note that if zero elements are returned, it is not considered // an error condition - an empty tuple is simply returned. }
bool CDirectShowDeviceEnumerator::CreateFilter(REFCLSID clsidDeviceClass,LPCWSTR pszFriendlyName,IBaseFilter **ppFilter) { HRESULT hr; ICreateDevEnum *pDevEnum; hr=::CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,reinterpret_cast<void**>(&pDevEnum)); if (FAILED(hr)) return false; IEnumMoniker *pEnumCategory; hr=pDevEnum->CreateClassEnumerator(clsidDeviceClass,&pEnumCategory,0); bool bFound=false; if (hr==S_OK) { IMoniker *pMoniker; ULONG cFetched; while (pEnumCategory->Next(1,&pMoniker,&cFetched)==S_OK) { IPropertyBag *pPropBag; hr=pMoniker->BindToStorage(0,0,IID_IPropertyBag,reinterpret_cast<void**>(&pPropBag)); if (SUCCEEDED(hr)) { VARIANT varName; ::VariantInit(&varName); hr=pPropBag->Read(L"FriendlyName",&varName,0); if (SUCCEEDED(hr)) { if (::lstrcmpiW(varName.bstrVal,pszFriendlyName)==0) { hr=pMoniker->BindToObject(NULL,NULL,IID_IBaseFilter, reinterpret_cast<void**>(ppFilter)); bFound=true; } } ::VariantClear(&varName); pPropBag->Release(); } pMoniker->Release(); if (bFound) break; } pEnumCategory->Release(); } pDevEnum->Release(); if (!bFound) return false; return SUCCEEDED(hr); }
JNIEXPORT jlong JNICALL Java_com4j_Native_getNextRunningObject(JNIEnv *env, jclass __unused__, jlong rotPointer, jlong enumMonikerPointer){ IRunningObjectTable *rot = reinterpret_cast<IRunningObjectTable*>(rotPointer); IEnumMoniker *enumMoniker = reinterpret_cast<IEnumMoniker*>(enumMonikerPointer); IMoniker *moniker; HRESULT hr = enumMoniker->Next(1, &moniker, NULL); if(hr == S_FALSE) { // This value indicates that there are no more elements, so do not report an error but return 0; // The Java part is responsible to call the Release on the rot and enumMoniker pointers! return 0; } else if(hr != S_OK){ error(env, __FILE__, __LINE__, hr, "IEnumMoniker:Next failed"); return 0; } IUnknown *unknown; rot->GetObject(moniker, &unknown); return reinterpret_cast<jlong>(unknown); }
HRESULT EnumCaptures(REFCLSID CLSID_DeviceCategory, std::vector<TCaptureDevice>& refDeviceList) { refDeviceList.clear(); ICreateDevEnum *pCreateDevEnum = 0; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum , NULL , CLSCTX_INPROC_SERVER , IID_ICreateDevEnum , (void**)&pCreateDevEnum); if (FAILED(hr)) return hr; IEnumMoniker* pEnumMoniker = 0; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_DeviceCategory, &pEnumMoniker, 0); if (FAILED(hr)) { pCreateDevEnum->Release(); return hr; } pEnumMoniker->Reset(); IMoniker* pMoniker = NULL; while (pEnumMoniker->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pBag = NULL; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if (SUCCEEDED(hr)) { VARIANT var = { 0 }; var.vt = VT_BSTR; hr = pBag->Read(_T("FriendlyName"), &var, NULL); if (SUCCEEDED(hr)) { TCaptureDevice device; _tcscpy_s(device.szDeviceName, var.bstrVal); refDeviceList.push_back(device); pBag->Release(); } } pMoniker->Release(); }//end while pEnumMoniker->Release(); pCreateDevEnum->Release(); return hr; }
IBaseFilter* get_capture_device(int device_num) { ICreateDevEnum* createDeviceEnum; CoCreateInstance(CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**) &createDeviceEnum); if (createDeviceEnum == 0) { return 0; } IEnumMoniker* enumMoniker; createDeviceEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &enumMoniker, 0); if (enumMoniker == 0) { createDeviceEnum->Release(); return 0; } enumMoniker->Reset(); IBaseFilter* result = 0; int index = 0; IMoniker* moniker; while (enumMoniker->Next(1, &moniker, 0) == S_OK) { if (index == device_num) { HRESULT bindToObjectResult = moniker->BindToObject(0, 0, IID_IBaseFilter, (void**) &result); break; } moniker->Release(); ++index; } enumMoniker->Release(); createDeviceEnum->Release(); return result; }
BOOL CSystemInfo::GetCameraInfo() { ::CoInitialize(NULL); ICreateDevEnum *pSysDevEnum = NULL; BOOL bIsGetSuccess = FALSE; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum); if (hr == S_FALSE) return FALSE; IEnumMoniker *pEnumCat = NULL; hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0); if (hr == S_FALSE) return FALSE; //Enumerate the monikers. IMoniker *pMoniker = NULL; ULONG cFetched; while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag = NULL; hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); if (SUCCEEDED(hr)) { //To retrieve the filter's friendly name, do the following: VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, 0); if (SUCCEEDED(hr)) { _bstr_t str(varName); tstrcpy(m_stCltHardInfo.szWebcam, MAX_PATH, (TCHAR*)str); bIsGetSuccess = TRUE; } VariantClear(&varName); //Remember to release pFilter later. pPropBag->Release(); } pMoniker->Release(); if (bIsGetSuccess) break; } pEnumCat->Release(); pSysDevEnum->Release(); ::CoUninitialize(); return TRUE; }
MonikersMap CaptureDShow::listMonikers() const { MonikersMap monikers; IEnumMoniker *pEnum = NULL; HRESULT hr = this->enumerateCameras(&pEnum); if (SUCCEEDED(hr)) { IMoniker *pMoniker = NULL; for (int i = 0; pEnum->Next(1, &pMoniker, NULL) == S_OK; i++) { IPropertyBag *pPropBag; HRESULT hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, reinterpret_cast<void **>(&pPropBag)); if (FAILED(hr)) { pMoniker->Release(); continue; } VARIANT var; VariantInit(&var); hr = pPropBag->Read(L"DevicePath", &var, 0); QString devicePath; if (SUCCEEDED(hr)) devicePath = QString::fromWCharArray(var.bstrVal); else devicePath = QString("/dev/video%1").arg(i); monikers[devicePath] = MonikerPtr(pMoniker, this->deleteUnknown); VariantClear(&var); pPropBag->Release(); } pEnum->Release(); } return monikers; }
//Обновляет массив m_pDSFMoniker[], хранящий список зарегистрированных в системе //фильтров DirectShow заданной категории //Функцию достаточно вызвать единожды (если не потребуются фильтры другой категории) void CDirectShow::UpdateDSFiltersArray(DSFCATEGORY dCategory) { ICreateDevEnum *pCreateDevEnum = NULL; IEnumMoniker *pEnumMoniker = NULL; GUID gSelCategory = { 0 }; for (m_lCounter = 0; m_lCounter < E_MAX_ARR_SIZE; m_lCounter++) { SR(m_pDSFMoniker[m_lCounter]); m_pDSFMoniker[m_lCounter] = NULL; } switch (dCategory) { case DSF_CATEGORY_AUDIO_INPUT_DEVICE: gSelCategory = CLSID_AudioInputDeviceCategory; break; case DSF_CATEGORY_AUDIO_COMPRESSOR: gSelCategory = CLSID_AudioCompressorCategory; break; case DSF_CATEGORY_AUDIO_RENDERER: gSelCategory = CLSID_AudioRendererCategory; break; case DSF_CATEGORY_LEGACY_AM_FILTER: gSelCategory = CLSID_LegacyAmFilterCategory; break; case DSF_CATEGORY_MIDI_RENDERER: gSelCategory = CLSID_MidiRendererCategory; break; case DSF_CATEGORY_VIDEO_INPUT_DEVICE: gSelCategory = CLSID_VideoInputDeviceCategory; break; case DSF_CATEGORY_VIDEO_COMPRESSOR: gSelCategory = CLSID_VideoCompressorCategory; break; default: return; } CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (LPVOID *)&pCreateDevEnum); pCreateDevEnum->CreateClassEnumerator(gSelCategory, &pEnumMoniker, 0); pEnumMoniker->Next(E_MAX_ARR_SIZE, &m_pDSFMoniker[0], &m_lDSFilCount); pEnumMoniker->Release(); pCreateDevEnum->Release(); }
int videoInputCamera::getDeviceCount() { ICreateDevEnum *pDevEnum = NULL; IEnumMoniker *pEnum = NULL; int deviceCount = 0; comInit(); HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum)); if (SUCCEEDED(hr)) { // Create an enumerator for the video capture category. hr = pDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &pEnum, 0); if(hr == S_OK) { IMoniker *pMoniker = NULL; while (pEnum->Next(1, &pMoniker, NULL) == S_OK){ pMoniker->Release(); pMoniker = NULL; deviceCount++; } pDevEnum->Release(); pDevEnum = NULL; pEnum->Release(); pEnum = NULL; } } comUnInit(); return deviceCount; }
/* 枚举本地系统的采集设备 */ int CVMR_Capture::EnumDevices(HWND hList) { if (!hList) return -1; int id = 0; // enumerate all video capture devices ICreateDevEnum *pCreateDevEnum; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum); if (hr != NOERROR) return -1; IEnumMoniker *pEm; hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0); if (hr != NOERROR) return -1; pEm->Reset(); ULONG cFetched; IMoniker *pM; while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) { IPropertyBag *pBag; hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); if(SUCCEEDED(hr)) { VARIANT var; var.vt = VT_BSTR; hr = pBag->Read(L"FriendlyName", &var, NULL); if (hr == NOERROR) { id++; (long)SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)var.bstrVal); SysFreeString(var.bstrVal); } pBag->Release(); } pM->Release(); } return id; }
// Code from http://msdn.microsoft.com/en-us/library/windows/desktop/dd377566(v=vs.85).aspx void Video::EnumerateDevices( EnumerateDelegate _pDeviceEnumerator, void* _pUserData ) { IEnumMoniker* pEnumerator = NULL; ASSERT( SUCCEEDED( EnumerateDevices( CLSID_VideoInputDeviceCategory, &pEnumerator ) ), "Failed enumerating devices!" ); VARIANT varFriendlyName, varDevicePath; VariantInit( &varFriendlyName ); VariantInit( &varDevicePath ); int DeviceIndex = 0; IMoniker* pMoniker = NULL; while ( pEnumerator->Next( 1, &pMoniker, NULL ) == S_OK ) { IPropertyBag* pPropBag; HRESULT hr = pMoniker->BindToStorage( 0, 0, IID_PPV_ARGS( &pPropBag ) ); if ( FAILED(hr) ) { pMoniker->Release(); continue; } // Get friendly name. hr = pPropBag->Read( L"FriendlyName", &varFriendlyName, 0 ); if ( !SUCCEEDED(hr) ) continue; hr = pPropBag->Read( L"DevicePath", &varDevicePath, 0 ); if ( !SUCCEEDED(hr) ) continue; // Notify delegate (*_pDeviceEnumerator)( DeviceIndex++, varFriendlyName.bstrVal, varDevicePath.bstrVal, pMoniker, _pUserData ); pPropBag->Release(); pMoniker->Release(); } pEnumerator->Release(); }