#include<iostream>
#include "strmif.h"
#include <initguid.h>
#include<vector>
#include<string>

#pragma comment(lib, "setupapi.lib")

using namespace std;

#define VI_MAX_CAMERAS 20
DEFINE_GUID(CLSID_SystemDeviceEnum, 0x62be5d10, 0x60eb, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
DEFINE_GUID(CLSID_VideoInputDeviceCategory, 0x860bb310, 0x5d01, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
DEFINE_GUID(IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);

//列出硬件设备
int listDevices(vector<string>& list)
{
  ICreateDevEnum *pDevEnum = NULL;
  IEnumMoniker *pEnum = NULL;
  int deviceCounter = 0;
  CoInitialize(NULL);

  HRESULT hr = CoCreateInstance(
    CLSID_SystemDeviceEnum,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_ICreateDevEnum,
    reinterpret_cast<void**>(&pDevEnum)
  );

  if (SUCCEEDED(hr))
  {
    hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);
    if (hr == S_OK){

      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, maybe the next one will work.
        }

        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"Description", &varName, 0);
        if (FAILED(hr))
        {
          hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        }

        if (SUCCEEDED(hr))
        {
          hr = pPropBag->Read(L"FriendlyName", &varName, 0);
          int count = 0;
          char tmp[255] = { 0 };
          while (varName.bstrVal[count] != 0x00 && count < 255)
          {
            tmp[count] = (char)varName.bstrVal[count];
            count++;
          }
          list.push_back(tmp);
        }

        pPropBag->Release();
        pPropBag = NULL;
        pMoniker->Release();
        pMoniker = NULL;

        deviceCounter++;
      }

      pDevEnum->Release();
      pDevEnum = NULL;
      pEnum->Release();
      pEnum = NULL;
    }
  }
  return deviceCounter;
}

int main()
{
  vector<string> CameraName;//存储摄像头名称
  int num = listDevices(CameraName);
  cout << "摄像头个数:" << num << endl;
  for (int i = 0; i < num; i++) {
    cout << " ID: "<< i << " : " << " Name: "<<CameraName[i] << endl;
  }

  //waitKey(0);
  system("pause");
  return 0;
}

===================运行效果===============

代码复制粘贴即可运行

最新文章

  1. javascript运动系列第四篇——抖动
  2. FMS 4中multicast脚本的小修正
  3. 背水一战 Windows 10 (1) - C# 6.0 新特性
  4. mysql动态行转列
  5. js获取url参数值(HTML之间传值)
  6. Eclipse安装jad插件进行反编译
  7. PostgreSQL的 fdw 跨库使用
  8. js 拼接 三列做为一行
  9. window程序设计1
  10. AFNetworking实现 断点续传
  11. 多线程并发 synchronized对象锁的控制与优化
  12. HostingEnvironment RegisterObject和QueueBackgroundWorkItem
  13. 使用PHP实现文件上传和多文件上传
  14. winform连接oracle时Oracle.DataAccess.dll版本问题
  15. django-个人博客登录及权限验证功能的实现
  16. Linux常用命令之链接命令和权限管理命令
  17. jQuery相关用法
  18. 用pymysql操作MySQL数据库
  19. 动态赋id
  20. Ren&#39;Py视觉小说安装,玩一下吧,上班很闲的话

热门文章

  1. web版源码管理软件SCM-Manager使用简要说明
  2. Codeforces Round #254(div2)B
  3. 用Java实现异构数据库的高效通用分页查询功能
  4. C#进阶之路(一):委托
  5. [BZOJ4573][ZJOI2016]大♂森林
  6. 消息队列mq总结(重点看,比较了主流消息队列框架)
  7. XSS与CSRF攻击
  8. Azure Blob存储更改缓存时间
  9. JDK 8 - java.util.HashSet 实现机制分析
  10. JVM插码之四:Java动态代理机制的对比(JDK 和CGLIB,Javassist,ASM)