惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
小众软件
小众软件
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
Jina AI
Jina AI
博客园 - 【当耐特】
V
Visual Studio Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
量子位
IT之家
IT之家
G
Google Developers Blog
V
V2EX
The GitHub Blog
The GitHub Blog
月光博客
月光博客
GbyAI
GbyAI

博客园 - Class Xman

手动建库时一个小错误:ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance Clouda聊天室实践 ASP.NET Repeater嵌套Repeater实现菜单加载 浅说正则——会了就不会忘 android开发中难免遇到listview刷新数据出现异常 hdu2068RPG的错排 用实例讲解RSA加密算法(精) ARM——操作系统—最小操作系统-开发板测试 HTML入门教程 HDU 4770 Lights Against DudelyLights (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素) Android 程序崩溃后的处理 IE7 float:left失效的解决方法 android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据 如何避免来自企业内部的网络安全威胁(二) Android安装失败 Installation error code: -110 Android TextWatcher监控EditText中的输入内容并限制其输入字符个数 不让自己的应用程序在桌面的图标列表里启动显示的方法 Fragment与FragmentAcitvity间的传值
Windows下USB磁盘开发系列二:枚举系统中所有USB设备
Class Xman · 2013-11-14 · via 博客园 - Class Xman

上篇 Windows下USB磁盘开发系列一:枚举系统中U盘的盘符介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘)。

主要调用的API如下:

1,调用SetupDiGetClassDevs()获取指定设备类型的句柄;

2,调用SetupDiEnumDeviceInfo()枚举设备信息;

3,调用SetupDiGetDeviceRegistryProperty()获取设备信息。

具体实现函数如下:

int enum_usb_device_info()
{		
	int i = 0;
	int res = 0;
	HDEVINFO hDevInfo;  
	SP_DEVINFO_DATA DeviceInfoData = {sizeof(DeviceInfoData)};   

	// get device class information handle
	hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB,0, 0, DIGCF_PRESENT);       
	if (hDevInfo == INVALID_HANDLE_VALUE)     
	{         
		res = GetLastError();     
		return res;
	}  

	// enumerute device information
	DWORD required_size = 0;
	for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
	{		
		DWORD DataT;         
		char friendly_name[2046] = {0};         
		DWORD buffersize = 2046;        
		DWORD req_bufsize = 0;      
		
		// get device description information
		if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &DataT, (LPBYTE)friendly_name, buffersize, &req_bufsize))
		{
			res = GetLastError();
			continue;
		}
		
		char temp[512] = {0};
		sprintf_s(temp, 512, "USB device %d: %s", i, friendly_name);
		puts(temp);
	}

	return 0;
}

注意:如果使用SetupDiGetDeviceRegistryProperty()试图获取SPDRP_FRIENDLYNAME属性时,有些设备回返回ERROR_INVALID_DATA(13)的错误,因为可能Friendly Name不存在,所以本例中采用获取SPDRP_DEVICEDESC属性的方法。

调用上面函数的输出结果如下: