阅读:1787回复:8
(20分求)如何用VC编写,一个能够找到U盘设备路径的程序!!!
请教各位大虾:
如何用VC编写,一个能够找到U盘设备路径的程序!!! |
|
沙发#
发布于:2004-04-05 17:25
根据GUID就能获得设备路径
实现GUID到设备路径的代码如下: // SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大 #define INTERFACE_DETAIL_SIZE (1024) // 根据GUID获得设备路径 // lpGuid: GUID指针 // pszDevicePath: 设备路径指针的指针 // 返回: 成功得到的设备路径个数,可能不止1个 int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath) { HDEVINFO hDevInfoSet; SP_DEVICE_INTERFACE_DATA ifdata; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail; int nCount; BOOL bResult; // 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID NULL, // 无关键字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败... if (hDevInfoSet == INVALID_HANDLE_VALUE) { return 0; } // 申请设备接口数据空间 pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); nCount = 0; bResult = TRUE; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 while (bResult) { ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口 bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄 NULL, // 不需额外的设备描述 lpGuid, // GUID (ULONG)nCount, // 设备信息集里的设备序号 &ifdata); // 设备接口信息 if (bResult) { // 取得该设备接口的细节(设备路径) bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 pDetail, // 设备接口细节(设备路径) INTERFACE_DETAIL_SIZE, // 输出缓冲区大小 NULL, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 if (bResult) { // 复制设备路径到输出缓冲区 ::strcpy(pszDevicePath[nCount], pDetail->DevicePath); // 调整计数值 nCount++; } } } // 释放设备接口数据空间 ::GlobalFree(pDetail); // 关闭设备信息集句柄 ::SetupDiDestroyDeviceInfoList(hDevInfoSet); return nCount; } 调用GetDevicePath函数时要注意,pszDevicePath是个指向字符串指针的指针,例如可以这样 int i; char* szDevicePath[MAX_DEVICE]; // 设备路径 // 分配需要的空间 for (i = 0; i < MAX_DEVICE; i++) { szDevicePath = new char[256]; } // 取设备路径 nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath); // 逐一获取设备信息 for (i = 0; i < nDevice; i++) { // 打开设备 hDevice = ::OpenDevice(szDevicePath); if (hDevice != INVALID_HANDLE_VALUE) { ... ... // I/O操作 ::CloseHandle(hDevice); } } // 释放空间 for (i = 0; i & lt; MAX_DEVICE; i++) { delete []szDevicePath; } 获取设备路径之后通过 IOCTL_STORAGE_QUERY_PROPERTY 就可确认是否为USB设备,并可以进一步判断其版本,ID等 ,具体可参看我以前发布的一个关于DEVICE_CHANGE的VC源代码. |
|
|
板凳#
发布于:2004-04-05 17:27
另外可参考StorageEnum,DISK ID等源代码
|
|
|
地板#
发布于:2004-04-05 17:28
另外:
http://www.csdn.net/develop/read_article.asp?id=17209 |
|
|
地下室#
发布于:2004-04-06 08:21
非常感谢dragon_hn兄:
先给分,代码慢慢看,谢谢! |
|
5楼#
发布于:2004-04-06 09:36
有没有工具或函数可以看设备的GUID了?
|
|
6楼#
发布于:2004-04-06 10:45
顶一下,这也是我想知道的!
|
|
7楼#
发布于:2004-04-06 11:14
为什么第二次用SetupDiGetInterfaceDeviceDetail时候产生1784的错误,取出路径是空的
|
|
8楼#
发布于:2004-04-07 17:35
已经得到路径,还要怎样才能对USB的Pipe(如Pipe1)进行通信呢?望高手再指点一下迷津!谢谢!!!
|
|