DirectShow控制台输出和保存视频设备名称

来源:互联网 发布:免费流程审批软件 编辑:程序博客网 时间:2024/05/22 11:54
#include "windows.h"  #include "TCHAR.h"  #include <dshow.h>#include <vector>#include <iostream>#include <cwctype>#define MAX_FRIENDLY_NAME_LENGTH    128  #define MAX_MONIKER_NAME_LENGTH     256typedef struct _TDeviceName{WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH];   // 设备友好名  WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH];     // 设备Moniker名  } TDeviceName;int _tmain(int argc, _TCHAR* argv[]){TDeviceName name;HRESULT hr;// 初始化std::vector<TDeviceName> vectorDevices;vectorDevices.clear();// 初始化COM  hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);if (FAILED(hr)){return hr;}// 创建系统设备枚举器实例  ICreateDevEnum *pSysDevEnum = NULL;hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum);if (FAILED(hr)){CoUninitialize();return hr;}// 获取设备类枚举器  IEnumMoniker *pEnumCat = NULL;hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);if (hr == S_OK){// 枚举设备名称  IMoniker *pMoniker = NULL;ULONG cFetched;while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK){IPropertyBag *pPropBag;hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void **)&pPropBag);if (SUCCEEDED(hr)){// 获取设备友好名  VARIANT varName;VariantInit(&varName);hr = pPropBag->Read(L"FriendlyName", &varName, NULL);if (SUCCEEDED(hr)){StringCchCopy(name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, varName.bstrVal);std::wcout << name.FriendlyName << std::endl;// 获取设备Moniker名  LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2));if (pOleDisplayName != NULL){hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName);if (SUCCEEDED(hr)){StringCchCopy(name.MonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName);vectorDevices.push_back(name);}CoTaskMemFree(pOleDisplayName);}}VariantClear(&varName);pPropBag->Release();}pMoniker->Release();} // End for While  pEnumCat->Release();}pSysDevEnum->Release();CoUninitialize();}

0 0
原创粉丝点击