阅读:3147回复:6
如何获得USB设备的PID、VID?
请教各位,我应该怎么样获得USB设备的PID、VID?谢谢!
|
|
沙发#
发布于:2004-08-03 18:23
非常感谢楼上的兄弟!
我想问,你的程序是基于WDM写的吧?只是我现在的程序是用纯C写的,可能很多API不能调用。 我的程序是这样子的: 有一支用纯C(VC 6.0环境)写的设备驱动程序Driver DLL,在Driver DLL上实现了诸如 OpenDevice(int PID, int VID)等函数,我现在需要用Delphi 7.0写一个测试程序,这个测试程序调用Driver DLL中的导出函数OpenDevice(int PID, int VID)以检验这个OpenDevice是不是能像预期一样完成指定功能,并把设备的状态信息回传到测试程序中显示。那么在测试程序中调用OpenDevice时,我肯定要给参数PID、VID赋值,请问我应该怎么样获得这PID、VID的值呢? 感谢大家告诉我! |
|
板凳#
发布于:2004-08-03 13:50
void CGetUDiskDriverDlg::SearchUDISK()
{ int nCount, len;//标记同一设备个数 HDEVINFO hDevInfoSet; BOOL bResult; char * devicename; char volume[MAX_PATH]; char ch[100]; memset(volume, 0, MAX_PATH); PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL; // 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // class GUID NULL, // 无关键字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败... if (hDevInfoSet == INVALID_HANDLE_VALUE) { return; } // 申请设备接口数据空间 nCount = 0; bResult = TRUE; SP_DEVICE_INTERFACE_DATA ifdata; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止 while (bResult) { ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口 bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄 NULL, // 不需额外的设备描述 (LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // GUID (ULONG)nCount, // 设备信息集里的设备序号 &ifdata); // 设备接口信息 if (bResult) { ULONG predictedLength = 0; ULONG requiredLength = 0; // 取得该设备接口的细节(设备路径) bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 NULL, // 设备接口细节(设备路径) 0, // 输出缓冲区大小 &requiredLength, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 // 取得该设备接口的细节(设备路径) predictedLength=requiredLength; // if(pDetail) // { // pDetail =NULL; // } pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄 &ifdata, // 设备接口信息 pDetail, // 设备接口细节(设备路径) predictedLength, // 输出缓冲区大小 &requiredLength, // 不需计算输出缓冲区大小(直接用设定值) NULL); // 不需额外的设备描述 if (bResult) { // 复制设备路径到输出缓冲区 for(int i=0;i<17;i++){ ch=*(pDetail->DevicePath+8+i); } ch[17]='\0'; if (strcmp(ch,"vid_11dd&pid_0101")==0 || strcmp(ch,"vid_11dd&pid_11dd")==0 || strcmp(ch,"vid_0101&pid_0101")==0 || strcmp(ch,"vid_0101&pid_11dd")==0) //比较版本号,防止意外出错 { len = strlen(pDetail->DevicePath); devicename = new char[len]; memset(devicename, 0, len); for(int i=0;i<(len-38);i++) { ch=*(pDetail->DevicePath+i); } ch[len-38]='\0'; memset(volume, 0, MAX_PATH); } } } nCount++; } // 释放设备接口数据空间 ::GlobalFree(pDetail); // 关闭设备信息集句柄 ::SetupDiDestroyDeviceInfoList(hDevInfoSet); } |
|
|
地板#
发布于:2004-07-31 20:25
我认为,VID、PID均是在系统加载设备驱动时使用的(通过.inf文件中的VID与PID与设备匹配来确定使用哪个驱动程序驱动设备),而在应用程序中却不是用它。
应用程序使用GUID或设备名来访问设备。 |
|
|
地下室#
发布于:2004-07-31 15:56
比如说我现在要在主程式中(exe)调用dll程式中的一支函数,dll中的函数名是OpenDriver(int pid, int vid),我需要在主程式中把pid、vid参数传到DLL中,那么在主程式中我怎么样去获得这些参数呢?如果机器上的设备很多,比如有ps/2、com、usb,且usb口有多个,那么我怎么去获得我想要打开设备的参数,又怎么去打开呢?
谢谢大家,希望得到大家的帮助!谢谢! |
|
5楼#
发布于:2004-07-30 21:20
Bus Hound
USBVeiw USBCheck 都可以!!! |
|
|
6楼#
发布于:2004-07-30 17:45
UsbView就可看到
|
|
|