社区
C++ 语言
帖子详情
C#如何实现插入USB显示其PID和VID
noslepums123
2014-07-29 09:31:54
RT 用VS2010
...全文
768
5
打赏
收藏
C#如何实现插入USB显示其PID和VID
RT 用VS2010
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sinat_23537947
2015-08-19
打赏
举报
回复
楼主,可以把代码给我看看吗,我也遇到问题了
寒熹
2014-07-31
打赏
举报
回复
public struct HIDD_VIDPID { public UInt16 VendorID; // 供应商标识 public UInt16 ProductID; // 产品编号 } /// <summary> /// 基于WDK获取系统设备的VIDPID /// </summary> public partial class USB { /// <summary> /// 获取系统所有设备的VIDPID /// </summary> public static HIDD_VIDPID[] AllVidPid { get { return WhoVidPid(Guid.Empty, Guid.Empty); } } /// <summary> /// 结合设备安装类GUID和设备接口类GUID获取设备VIDPID /// </summary> /// <param name="setupClassGuid">设备安装类GUID,Empty忽视</param> /// <param name="interfaceClassGuid">设备接口类GUID,Empty忽视</param> /// <returns>设备VIDPID列表</returns> /// <remarks> /// 优点:直接通过设备实例ID提取VIDPID,从而无需获取设备路径来读写IO /// </remarks> public static HIDD_VIDPID[] WhoVidPid(Guid setupClassGuid, Guid interfaceClassGuid, String Enumerator = null) { // 根据设备安装类GUID创建空的设备信息集合 IntPtr DeviceInfoSet; if (setupClassGuid == Guid.Empty) { DeviceInfoSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); } else { DeviceInfoSet = SetupDiCreateDeviceInfoList(ref setupClassGuid, IntPtr.Zero); } if (DeviceInfoSet == new IntPtr(-1)) return null; // 根据设备接口类GUID创建新的设备信息集合 IntPtr hDevInfo; if (interfaceClassGuid == Guid.Empty) { hDevInfo = SetupDiGetClassDevsEx( IntPtr.Zero, Enumerator, IntPtr.Zero, DIGCF.DIGCF_ALLCLASSES | DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT, DeviceInfoSet, null, IntPtr.Zero); } else { hDevInfo = SetupDiGetClassDevsEx( ref interfaceClassGuid, null, IntPtr.Zero, DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT, DeviceInfoSet, null, IntPtr.Zero); } if (hDevInfo == new IntPtr(-1)) return null; // 枚举所有设备 List<HIDD_VIDPID> DeviceList = new List<HIDD_VIDPID>(); // 存储设备实例ID StringBuilder DeviceInstanceId = new StringBuilder(256); // 获取设备信息数据 UInt32 DeviceIndex = 0; SP_DEVINFO_DATA DeviceInfoData = SP_DEVINFO_DATA.Empty; while (SetupDiEnumDeviceInfo(hDevInfo, DeviceIndex++, ref DeviceInfoData)) { // 获取设备实例ID if (SetupDiGetDeviceInstanceId(hDevInfo, ref DeviceInfoData, DeviceInstanceId, DeviceInstanceId.Capacity, IntPtr.Zero)) { String PNPDeviceID = DeviceInstanceId.ToString(); Match match = Regex.Match(PNPDeviceID, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}"); if (match.Success) { HIDD_VIDPID Entity; Entity.VendorID = Convert.ToUInt16(match.Value.Substring(4, 4), 16); // 供应商标识 Entity.ProductID = Convert.ToUInt16(match.Value.Substring(13, 4), 16); // 产品编号 if (!DeviceList.Contains(Entity)) DeviceList.Add(Entity); } } } SetupDiDestroyDeviceInfoList(hDevInfo); if (DeviceList.Count == 0) return null; else return DeviceList.ToArray(); } /// <summary> /// 从搜索列表中提取出存在于系统中的VIDPID /// </summary> /// <param name="searchList">搜索列表</param> /// <returns>系统中存在的VIDPID列表</returns> public static HIDD_VIDPID[] WhoVidPid(HIDD_VIDPID[] searchList) { // 获取系统所有设备的VIDPID集合 HIDD_VIDPID[] DeviceCollection = AllVidPid; if (DeviceCollection == null) return null; List<HIDD_VIDPID> ValidList = new List<HIDD_VIDPID>(); foreach (HIDD_VIDPID VidPid in searchList) { if (Array.IndexOf(DeviceCollection, VidPid) != -1) { ValidList.Add(VidPid); } } if (ValidList.Count == 0) return null; else return ValidList.ToArray(); } } }
xiaohuh421
2014-07-29
打赏
举报
回复
http://social.microsoft.com/Forums/nl-NL/18eca9e1-b79a-4165-9ef1-7a80d405638d/cusb?forum=visualcshartzhchs
haifeng3326
2014-07-29
打赏
举报
回复
c++的知道,c#没搞过,但是应该差不多吧 设备接口类GUID,SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces……………………这些函数,网上搜一下应该挺多的
whoho
2014-07-29
打赏
举报
回复
能让版主移动到C#版块去?发错位置了
USB
Device(
VID
_1f3a_
PID
_efe8)
USB
Device(
VID
_1f3a_
PID
_efe8)
获取U盘
VID
,
PID
,盘符,物理序列号(源码)可运行
获取U盘
VID
,
PID
,盘符,物理序列号(源码)可运行: 在论坛上只是看到了获取逻辑序列号等信息的资料 :eek::eek: 后来参考了些大侠的资料和讲解:终于搞出来了! (当然源码对于U盘,移动硬盘,手机卡,MP3/4都OK ) 不只大虾名讳,只能在此感谢.... 【vc6 绝对OK ....有问题空间留言谢谢】 最后获得的类似: PFAD_G\
VID
_0951&
PID
_1623\001CC0EC32CDEA10969B011D PFAD:盘符 中间
VID
PID
最后的是 物理序列号
金士顿u盘修复 金士顿量产工具 量产工具 phison-UP10量产工具v1.78
phison-UP10量产工具v1.78.00(U盘量产工具),亲测成功!!!设备名称: [I:]
USB
Mass Storage Device(Kingston DataTraveler 2.0
USB
Device) PNP设备ID:
VID
= 0951
PID
= 1607 设备序列号: 5B780FA602D0 设备版本: PMAP 设备类型: 标准
USB
设备 -
USB
2.0高速 芯片制造商: skymedi(擎泰) 芯片型号: SK6281/PS2232(版本号PMAP) 产品制造商: Kingston(金士顿) 产品型号: DataTraveler 2.0 U盘:金士顿2G 型号DMFP/2GB 量产工具:phison-UP10量产工具v1.78.00 方法: 1、将下载的phison-UP10量产工具v1.78.00解压到任一目录。 2、运行F1_B4_v178.exe或F2_v178.exe点击“取得信息”,如果从“测试报告”窗口有内容说明可以使用此工具量产你的U盘;如果弹出“没有找到设备”信息你只好另找了。 3、退出程序 4、运行ParamEdt.exe,配置--模式栏输入“21”,再选择“select”可选光盘ISO或BIN文件。然后按另存为一个1.ini文件。注意F1对应F1_B4_v178.exe;F2对应F2_v178.exe。(或者可直接配置好ini附后(1.ini),在文件中直接改ISO文件存放目录也可。) 1.ini文件 [Extra] Mode=21 [Misc] CDROM Image=D:\系统\萝卜家园 Ghost XP SP3 电脑城装机版 8.8.iso (←改成ISO文件存放目录) 5、再运行F1_B4_v178.exe或F2_v178.exe点击“开始”。稍等一会……下面变成绿色的框就成功了。再点“弹出”,重新
插入
U盘。 6、此量产工具模式可选择很多,有一些并不适用自己的U盘,其它参数你也需要多试一试才能成功。 在BIOS中启动设置为
USB
-CDROM 恢复时选择PE模式 还原 用原来的量产工具,选择模式3,重新量产一次。 注意:镜像文件选择留空就行了。 再用F1_B4_v178.exe,ini文件选param,方法同上。(不能i还原的,可进行低格)
TC58NC6686G1F 量产工具
来自数码之家,本人已经用过了这是我的信息,量化请看好 PNP设备ID:
VID
= 0930
PID
= 6544 设备序列号: 0019B92B1085C8B18E3300DA 设备版本: 1.00 设备类型: 标准
USB
设备 -
USB
2.0高速 芯片制造商: Toshiba(东芝) 芯片型号: TC58NC6686G1F 产品制造商: Kingston 产品型号: DataTraveler 2.0
c#
获取串口
USB
pid
,
vid
方法。
我之前是有开源项目EZ
USB
获取电脑的
pid
,
vid
。功能很全,很强大,展示效果也很好,但是它有个BUG,就是个别
USB
的接口识别不到
pid
,
vid
。这个就可麻烦了。需要重新找方法。
c#
的方法很少。需要使用c++编写动态库的形式获取。而c++又不能直接返回字符串。必须要在
c#
中开辟一块空间,将控件传递给c++,c++获取到信息后在赋值返回。这就是我用的方法。其中用到几个知识点。 1). 如何制作c++动态库。需要制作不换名的动态库,不然更换电脑是不能调用的。 2). c++如何返回字符串给
c#
使用。
C++ 语言
64,637
社区成员
250,559
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章