关于SetupDiEnumDeviceInfo枚举设备返回 缓冲区无效 解决办法
来源:互联网 发布:openstack云计算入门 编辑:程序博客网 时间:2024/05/16 18:46
现象:我的程序中有个功能是要枚举设备。代码如下, 在XP 32位系统下运行没有问题,到Win7 64位系统时则不能枚举。调试发现SetupDiEnumDeviceInfo返回false。
public static List<string> GetDeviceProperty(string portname) { List<string> HWList = new List<string>(); try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, DIGCF_ALLCLASSES | DIGCF_PRESENT); if (hDevInfo.ToInt32() == INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new SP_DEVINFO_DATA(); DeviceInfoData.cbSize = 28; DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder property = new StringBuilder(""); property.Capacity = MAX_DEV_LEN; for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, (uint)SPDRP_CLASS, 0, property, (uint)property.Capacity, IntPtr.Zero); if (property.ToString().ToLower() != "ports") { continue; } SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, (uint)SPDRP_FRIENDLYNAME, 0, property, (uint)property.Capacity, IntPtr.Zero); if (!property.ToString().ToLower().Contains(portname.ToLower())) continue;//找到对应于portname的设备 string port = property.ToString().Trim().Substring(property.ToString().IndexOf("(")); port = port.Replace("(", "").Replace(")", ""); HWList.Add(port); break; } Console.Write(Marshal.GetLastWin32Error().ToString()); SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("枚举设备列表出错", ex); } return HWList; }
分析原因: 是32位和64位系统差异造成。
解决办法:判断是否为64位系统。
if (Environment.Is64BitOperatingSystem) DeviceInfoData.cbSize = 32;//(16,4,4,4) else DeviceInfoData.cbSize = 28;转:http://blog.csdn.net/ypoflyer/article/details/17224841
0 0
- 关于SetupDiEnumDeviceInfo枚举设备返回 缓冲区无效 解决办法
- 关于SetupDiEnumDeviceInfo枚举设备返回false问题的解决办法
- SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty 枚举设备手机
- php file_get_contents返回空 无效解决办法
- 关于缓冲区到函数返回地址分析
- 关于Windows下USB函数SetupDiEnumDeviceInfo()与SetupDiEnumDeviceInterfaces()的心得
- 关于AutoCompleteTextView设置背景无效的解决办法
- 关于linux敲入lsof无效解决办法
- Android TabActivity 返回键监听无效的解决办法
- 关于scanf 保留回车在缓冲区的解决办法
- 关于缓冲区
- 设备枚举
- 设备枚举
- 关于rotate动画在ios设备无效的问题
- 关于HttpClinet4.5超时设置无效(一直无法返回数据)
- 关于java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度问题
- 关于子函数返回指针的解决办法
- 关于Retrofit返回错误信息的统一解决办法
- hdu2098分拆素数和
- 【LeetCode】-Pascal's Triangle
- IOS开发网络篇之──ASIHTTPRequest详解
- Android配置NDK(不用Cygwin)
- Cocos2d-x教程(10)-CCProgressTimer实现页面加载进度条效果
- 关于SetupDiEnumDeviceInfo枚举设备返回 缓冲区无效 解决办法
- javaScript身份证严格验证
- jdom解析xml文件简单实例
- verilog的基本语法
- 3.2.4 模式匹配元组
- ubuntu root 用户登陆声音无法调节大小问题解决
- linux 下加载bou2_4p.shp后乱码问题
- cocos2D场景切换方式总汇
- Http请求