#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 256 typedef 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(); }