c# 如何读取usb的vid,pid.

ekeyang 2009-09-07 11:07:08
本人不会c++,在网上搜了很多,都说用SetupDiGetDeviceInstanceId.可是并不知道怎么使用.
在csdn中看到一篇文章,贴到程序上之后返回的HID class,并不是想要的结果.而且那个博主已经年多没登陆过了.
所以在这求教各位高人了.
需要完整的代码.谢谢.
...全文
3653 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
koala_天下 2012-08-29
  • 打赏
  • 举报
回复
想问一下,新连入一个设备怎么查看这个设备的Pid和Vid啊?
yymqt 2011-08-26
  • 打赏
  • 举报
回复
也在找USB相关资料,先试试
洁辉 2011-08-23
  • 打赏
  • 举报
回复
不错哦
loee2007 2011-04-07
  • 打赏
  • 举报
回复
不错哦!
liuhair1314520 2011-03-01
  • 打赏
  • 举报
回复
学习中...
浪子追风 2011-02-26
  • 打赏
  • 举报
回复
一样的纠结啊!试了很多次,在lab/cvi下面就是不行啊!
z510124997 2011-02-25
  • 打赏
  • 举报
回复
一样的纠结中。。
lhh16712 2011-02-16
  • 打赏
  • 举报
回复
有没有好心人,提供一下啊,偶也在求U盘的VID,PID,序列号等信息。这方面应该有专家的哈。
zhouxy1025 2010-11-16
  • 打赏
  • 举报
回复
正在关注这个问题的解决
悟OO道 2010-10-22
  • 打赏
  • 举报
回复
從以上的這幾種方法來看,由於每個方法都是通過對於系統的設備進行掃描然後得出U盤盤符、PID/VID,序列號…等。而且由於這些信息是通過多種方法獲得的,儅計算機連接多個usb設備時,那麽以上的這些信息就無法正確的對應起來,尤其是U盤盤符與其唯一標識Serial Number無法對應,這樣很不利于我們正確的選擇目標usb設備。下面我們來看如何通過U盤盤符找到對應的設備序列號。 第一步,我們仍可以按照方法1种所提到的通過遍歷盤符屬性來找到所有連接到機器上的U盤盤符,然後CreateFile獲得設備句柄。 第二步,在應用DeviceIoControl函數的時候,我們需要引入一個新的查詢方式IOCTL_STORAGE_GET_DEVICE_NUMBER,如STORAGE_DEVICE_NUMBER sdn;DWORD dwBytesReturned = 0;// 用IOCTL_STORAGE_GET_DEVICE_NUMBER取设备號 bResult = ::DeviceIoControl(hDevice, // 设备句柄 IOCTL_STORAGE_GET_DEVICE_NUMBER, // 取设备属性信息 NULL, 0, // 输入数据缓冲区 sdn, sdn ->Size, // 输出数据缓冲区 & dwBytesReturned, // 输出数据地址 (LPOVERLAPPED)NULL); // 用同步I/O DeviceNumber = pDevDesc.DeviceNumber; 這樣我們可以獲得該盤符對應的設備號,同樣我們可以通過QueryDosDevice來找到該盤符對應的dos設備名:QueryDosDevice(szDevicePath, //設備路徑,如:“F:”szDosDeviceName, //查詢返回的dos設備名MAX_PATH); 到現在爲止,我們通過盤符獲得了兩個信息:DeviceNumber,szDosDeviceName。第三步用下面這樣一個函數來找到相應的設備序列號:DEVINST GetDrivesDevInstByDiskNumber (long DiskNumber, char *szDosDeviceName){…//函數的前半部分與方法2种提到的方法相同目的是爲了獲得一個DivicePath;…//注意這裡用到的GUID應該是DiskClassGuid; HANDLE hDrive = CreateFile(pspdidd->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if ( hDrive != INVALID_HANDLE_VALUE ) { STORAGE_DEVICE_NUMBER sdn; DWORD dwBytesReturned = 0; //通過這樣一個句柄,用同樣的方法也可以得到一個設備號。 res = DeviceIoControl(hDrive,
IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL,
0
&sdn,
sizeof(sdn), &dwBytesReturned, NULL); if ( res ){ //這句是關鍵,通過這兩种方法獲得的.DeviceNumber,進行比較,以DeviceNumber
//作爲橋梁,找到了對應的設備 if ( DiskNumber == (long)sdn.DeviceNumber ) { CloseHandle(hDrive); SetupDiDestroyDeviceInfoList(hDevInfo); return spdd.DevInst; //這裡是來返回一個DeviceInstance。 } } CloseHandle(hDrive); … } Return 0;} 調用以上這個函數,我們獲得了一個DEVINST,這樣我們就可以通過DDK中CM_Get_Device_ID來獲得設備ID:char Buf[MAX_PATH];CM_Get_Device_ID(DevInst,Buf,MAX_PATH,0);其中的Buf中返回的就是DeviceInstanceID,這是一個形如“USBSTOR\DISK&VEN________&PROD_FREEDIK-LWFORMAT&REV_2.23\2004063008241001”的字符串,我們可以看到字符串的最後一串數字就是我們想要得到的SerialNumber。
liufabing 2009-09-27
  • 打赏
  • 举报
回复
libusbdotnet

http://sourceforge.net/projects/libusbdotnet/files/
ekeyang 2009-09-11
  • 打赏
  • 举报
回复
另外过段时间如果把这个问题完全解决,我会在博客中放入我的代码.希望以后有人再遇到这个问题能有个解决办法.
不多说了,结贴.
ekeyang 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wangkuang5 的回复:]
引用 16 楼 ekeyang 的回复:
引用 12 楼 wangkuang5 的回复:
我代码可是自动获取的,遍历加载它的事件来读数据

抱歉,你的下载分数太高,我没那么多分,所以下不了.


现在去掉了
[/Quote]
我看了,和我想要的有些差距,另外其实我知道可以调系统的api去弄,可是一碰到托管的那些东西确实有点头大.这个问题先放下,因为还要照顾进度.还是谢谢.
wangkuang5 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ekeyang 的回复:]
引用 12 楼 wangkuang5 的回复:
我代码可是自动获取的,遍历加载它的事件来读数据

抱歉,你的下载分数太高,我没那么多分,所以下不了.
[/Quote]

现在去掉了
蒋晟 2009-09-10
  • 打赏
  • 举报
回复
让用户自己选了,设备厂商不太可能写个虚拟设备还要照顾开发人员的需求再写个API让你从USB获得串口端口信息
nixiang12 2009-09-10
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
ekeyang 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wangkuang5 的回复:]
我代码可是自动获取的,遍历加载它的事件来读数据
[/Quote]
抱歉,你的下载分数太高,我没那么多分,所以下不了.
ekeyang 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jiangsheng 的回复:]
USB哪来的端口号……串口才有。

[/Quote]
是usb转串口设备
蒋晟 2009-09-09
  • 打赏
  • 举报
回复
USB哪来的端口号……串口才有。
wolililaile 2009-09-09
  • 打赏
  • 举报
回复
加载更多回复(12)

110,579

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧