通过串口号获得该串口号对应的设备信息(如设备范例ID等)

        前几天一直在处理标题上面的那个问题,搜遍千山万水,反复实验,最后终于找到一种方法,本文不仅仅介绍这种方法,还介绍了解决问题的整个过程,还有一些通用的东西,希望能向那些和我一样一点不懂C/C++,不懂win32APi,从事C#winform开发的C#菜鸟提供点帮助,让大家少走弯路。
        我们采用trouble shooting的方式开始:
        问题描述:如标题,要求是不能用wmi,因为本程序是要运行在98机器上的,而98机器要运行wmi得先安装wmicore组件,太麻烦,所以决定用win32 api实现,如何实现?
        实现步骤:
        1.如何找到自己想要的api(事先不知道api函数名)?
        首先当然是一阵海搜啦,百度,google(google一般不太爱用,一是觉得它没有百度方便,二是它不是国产),最后得到一个答案:在MSDN里找,接下来问题就变为如何在msdn里面找自己想要的api,通过一顿实验,最后找到方法:打开msdn(注:本文说讲msdn均为vs2005自带的,不是mdsn网站,网站速度太慢,没效率),使用索引--刷选框中选中platform sdk,搜索词为win32 api--选中第一项,这个主提是关于api的,里面有好多有用的子主题:base services(把api按照功能分类),data type(api函数里的c数据类型描述),reference(api参考,包括了几乎所有的api函数),最后通过问题描述,在device management reference里面找到了我想要的api,大家可以用这种方式找到自己想要的api
        2.找到了api,如何使用它们?
        又是一顿海搜,最后得到2篇介绍用c#调用api的文章,各有侧重点,推荐大家去看下,http://www.czvec.com/jt/main/output.asp?haxz2=358http://blog.csdn.net/zhoufoxcn/archive/2006/09/22/1265520.aspx#811513,我在这里通过一个例子向大家讲解如何使用api:
HDEVINFO SetupDiGetClassDevs(
  const GUID* ClassGuid,
  PCTSTR Enumerator,
  HWND hwndParent,
  DWORD Flags
);
刚看到这个函数声明不禁有点晕,我们一点一点来,这个函数可以获得某一分类的所有设备信息集合(device information set),参看文档说明,发现前面几个参数设置和最后一个参数flags有关系,先看flags,它有DIGCF_ALLCLASSES,DIGCF_DEVICEINTERFACE,DIGCF_PRESENT,DIGCF_PROFILE等值,但是这些值等于多少,怎么设置?不要担心,在这页文档的最后有一个requiments表格,里面有很多有用信息,如我们要dllimport的dll文件名(Setupapi.dll),当前api支持的平台,还有header(Setupapi.h,此文件定义了DIGCF_ALLCLASSES等字符串所对应的值),好,下一步是如何得到Setupapi.h呢?最笨的办法是搜索本地硬盘,最后我在D:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include里面找到了它,那个目录下还有很多别的header文件,flag值的设定搞定了。
HWND hwndParent这个参数表示的是应用程序某个窗口的句柄,没什么用,随便设置下。
PCTSTR Enumerator这个参数分2中情况,在设置了DIGCF_DEVICEINTERFACE时它表示一个PNP设备(pnp=plug and play,即插即用,我猜的)的名字,这时候返回的将是存储了此设备的所有接口的设备信息集合,如果没设置DIGCF_DEVICEINTERFACE,又要使用该参数,则该参数表示的是某一类型的名称(这个名称可以在注册表HKLM/SYSTEM/CurrentControlSet/Enum中找到,本文为“USB”),此时函数返回的是该类型下的所有设备信息集合(USB则能得到所有USB设备的集合)
const GUID* ClassGuid,参数说明:它表示某类设备类型的guid,通过设置它你能得到所有guid等于该参数的设备信息集合,前提是你没把flag参数设为DIGCF_ALLCLASSES(如果设置了此项,则你输入的guid无效,它将直接返回当前机器的所有设备信息集合(Enumerator=null)或者Enumerator类型的设备信息集合),但是,如何去寻找这个guid呢,可以通过查阅设备的驱动程序信息文件(*.inf文件,它包含在设备驱动程序安装包里,或者你直接到c:/windows/inf(98.XP等),c:winnt/inf(2000)等下面去找,inf文件记录了特定设备的很多信息,如pid,vid,classguid等信息),查到guid字符串,直接调用new Guid(string)就可以得到一个guid了
   参数讲解完毕,下面是如何把C语言数据字段映射到C#数据字段,要是大家看了前面我推荐的2篇文章的话就知道映射的一般原则了,大体上按照如下原则进行:首先看清楚当前参数的作用,这很重要,因为一个C数据字段可以映射为好几个C#数据字段,而且都不会出错,例如HWND你可以把它映射为IntPtr,也可以映射为UINT32,PCTSTR可以把它映射为string,也可以映射为UINT32(string的地址),本例子为了调用方面,我用的是string,一般有以下几个诀窍:string一般用来做输入参数(因为它长度固定),stringBuilder用来作为接收(输出)参数,如果一个参数表示的是某个对象(不是基础值类型,例如一个窗口,一个设备等)的指针,最好还是用IntPtr类型(句柄),structure类型一定要用ref或者out关键字把它变成按引用传递(当然,如果你不想用ref等,那就别定义structure了,用class替代,至于副作用麻,我也不清楚),还有很多别的技巧,看了那2篇文章大家就清楚了。通过调用device management下的api,我们可以获得各种设备的设备信息,还可以对设备进行某些操作(安装新设备,卸载设备,启动,禁用设备等)
    我想看完本文,大家就对如何调用win32APi有个皮毛了解了吧,一些简单调用也会用了吧。下面是我的标题问题的答案,(感觉可以用CreateFile得到对应于某串口号的设备句柄,但是得到句柄后如何才能得到该设备的信息呢?此时好像用device management下的api没用,希望有高人能给我提供此解决方案,不胜感激!)

HardWareOperation.cs

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Runtime.InteropServices;

namespace  ForGeneralUse
{
    
public   class  HardWareOperation
    {
        
///   <summary>
        
///  设备的各项属性,注意有些属性是不通用的,例如SPDRP_FRIENDLYNAME只适用于端口设备
        
///   </summary>
         public   enum  SPDRP_
        {
            SPDRP_DEVICEDESC 
=  ( 0x00000000 ),   //  DeviceDesc (R/W)
            SPDRP_HARDWAREID  =  ( 0x00000001 ),   //  HardwareID (R/W)
            SPDRP_SERVICE  =  ( 0x00000004 ),  //  Service (R/W)
            SPDRP_CLASS  =  ( 0x00000007 ),   //  Class (R--tied to ClassGUID)
            SPDRP_CLASSGUID  =  ( 0x00000008 ),   //  ClassGUID (R/W)
            SPDRP_DRIVER  =  ( 0x00000009 ),   //  Driver (R/W)
            SPDRP_CONFIGFLAGS  =  ( 0x0000000A ),  //  ConfigFlags (R/W)
            SPDRP_MFG  =  ( 0x0000000B ),  //  Mfg (R/W)
            SPDRP_FRIENDLYNAME  =  (
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值