查询硬件信息(友好名称)的方法

By admin at 2017-12-10 • 0人收藏 • 2413人看过

在上面我们曾经用到了串口通信,我们利用读取注册表来获取到了系统中所有的硬件串口的端口号,但是,有些时候我们电脑中的硬件串口不止一个,这样的话,我们每次打算使用串口,必须先要去到设备管理器里面看看我们准备使用的硬件串口到底是哪个,才能在软件里面选择相应的com口,这样做就显得繁琐了,我们能不能在软件里面加入一个硬件串口的友好名称指示,这样就不必每次去到设备管理器里面查看了.,

如下图所示:

我电脑中有两个串口

而先前我们的软件中选择只能看到这些:

我们只看到端口确实有两个,分别是com1和com2,但是我们不知道应该用的是哪个

但是我们去到设备管理器里面看到,他们两个显示的名称分别是:



如果软件中用这个名称进行指示,那么就不会搞错端口了.

为了实现这个功能,我们需要用到以下功能:

首先新建了个控制台,写入下面的代码:

//查询硬件信息
 
import console;
import win.guid;
import win.reg;
 
 
//串口号
var reg = win.regReader("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\");
if(reg)
{
    for(name,value,t in reg.eachValue()) 
    {
        console.log(name +"   "+ value);
    }
     
}
 
 
Setupapi := raw.loadDll("Setupapi.dll")
SetupDiGetDeviceRegistryProperty = Setupapi.api("SetupDiGetDeviceRegistryProperty"
    ,"bool(addr deviceInfoSet,struct deviceInfoData,INT property,INT &dataType,ustring &propertyBuffer,INT propertyBufferSize,INT &requiredSize)" )
 
class SP_DEVINFO_DATA {
  INT cbSize;
  struct classGuid = ..win.guid();
  INT devInst;
  ADDR reserved;
}
 
var guidMedia = win.guid.fromString("{4d36e978-e325-11ce-bfc1-08002be10318}");
var  hScsi  =  Setupapi.SetupDiGetClassDevs( guidMedia,  null,  null,   2/*_DIGCF_PRESENT*/);  // _DIGCF_PRESENT:只返回当前存在的设备
 
var adapterData = SP_DEVINFO_DATA()
adapterData.cbSize  =  raw.sizeof(adapterData);  
 
var idx = 0;
while(Setupapi.SetupDiEnumDeviceInfo(hScsi,idx,adapterData)){
 
    var ret,dataType,propertyBuffer,requiredSize = SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12 /*_SPDRP_FRIENDLYNAME */,0,0,0,0);
    ret,dataType,propertyBuffer,requiredSize = SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12/*_SPDRP_FRIENDLYNAME */,0,requiredSize,requiredSize,0)
    console.log( propertyBuffer )
    idx ++;
}
 
Setupapi.SetupDiDestroyDeviceInfoList(hScsi)
 
console.pause()

运行后的结果是:

这样就得到了我们想要的友好名称

下面说下为什么是上面的写法:

第一,这个代码是我根据aardio的例子改编来的


这个示例是列出电脑中的主板等硬件信息,如果我们只是想列出其他设备管理器里面的特定分类的东西,那么我们需要先知道这个分类里面的GUID码

举例: 我们这里需要列出设备管理器中的端口(com和LPT)分类

我们在这个分类里面的任意一个设备上面点击右键->属性->详细信息->设备类(GUID)

然后在这个代码上面点击右键,选择复制.

把这个代码复制到上面的程序中,例如:

var guidMedia = win.guid.fromString("{4d36e978-e325-11ce-bfc1-08002be10318}");

这样就能定性这个分类了.

然后你肯定也会疑惑下面的代码中的数字是从哪里来的????

var  hScsi  =  Setupapi.SetupDiGetClassDevs( guidMedia,  null,  null,   2/*_DIGCF_PRESENT*/);
和
SetupDiGetDeviceRegistryProperty(hScsi,adapterData,12 /*_SPDRP_FRIENDLYNAME */,0,0,0,0);

他们里面的

2/*_DIGCF_PRESENT*/
12 /*_SPDRP_FRIENDLYNAME */

从哪里得知的啊??

解答这个问题,你就要取微软的官方看文档了,这里我百度搜到的注释先列出来.

public enum DIGCF
{
DIGCF_DEFAULT = 0x1,
DIGCF_PRESENT = 0x2,
DIGCF_ALLCLASSES = 0x4,
DIGCF_PROFILE = 0x8,
DIGCF_DEVICEINTERFACE = 0x10
}
 
public enum SPDRP
{
SPDRP_DEVICEDESC = 0,
SPDRP_HARDWAREID = 0x1,
SPDRP_COMPATIBLEIDS = 0x2,
SPDRP_UNUSED0 = 0x3,
SPDRP_SERVICE = 0x4,
SPDRP_UNUSED1 = 0x5,
SPDRP_UNUSED2 = 0x6,
SPDRP_CLASS = 0x7,
SPDRP_CLASSGUID = 0x8,
SPDRP_DRIVER = 0x9,
SPDRP_CONFIGFLAGS = 0xA,
SPDRP_MFG = 0xB,
SPDRP_FRIENDLYNAME = 0xC,
SPDRP_LOCATION_INFORMATION = 0xD,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0xE,
SPDRP_CAPABILITIES = 0xF,
SPDRP_UI_NUMBER = 0x10,
SPDRP_UPPERFILTERS = 0x11,
SPDRP_LOWERFILTERS = 0x12,
SPDRP_BUSTYPEGUID = 0x13,
SPDRP_LEGACYBUSTYPE = 0x14,
SPDRP_BUSNUMBER = 0x15,
SPDRP_ENUMERATOR_NAME = 0x16,
SPDRP_SECURITY = 0x17,
SPDRP_SECURITY_SDS = 0x18,
SPDRP_DEVTYPE = 0x19,
SPDRP_EXCLUSIVE = 0x1A,
SPDRP_CHARACTERISTICS = 0x1B,
SPDRP_ADDRESS = 0x1C,
SPDRP_UI_NUMBER_DESC_FORMAT = 0x1E,
SPDRP_MAXIMUM_PROPERTY = 0x1F
}
 
public enum DICS
{
DICS_ENABLE = 0x1,
DICS_DISABLE = 0x2,
DICS_PROPCHANGE = 0x3,
DICS_START = 0x4,
DICS_STOP = 0x5,
DICS_FLAG_GLOBAL = DICS_ENABLE,
DICS_FLAG_CONFIGSPECIFIC = DICS_DISABLE,
DICS_FLAG_CONFIGGENERAL = DICS_START
}
 
public enum DIF
{
DIF_SELECTDEVICE = 0x1,
DIF_INSTALLDEVICE = 0x2,
DIF_ASSIGNRESOURCES = 0x3,
DIF_PROPERTIES = 0x4,
DIF_REMOVE = 0x5,
DIF_FIRSTTIMESETUP = 0x6,
DIF_FOUNDDEVICE = 0x7,
DIF_SELECTCLASSDRIVERS = 0x8,
DIF_VALIDATECLASSDRIVERS = 0x9,
DIF_INSTALLCLASSDRIVERS = 0xA,
DIF_CALCDISKSPACE = 0xB,
DIF_DESTROYPRIVATEDATA = 0xC,
DIF_VALIDATEDRIVER = 0xD,
DIF_MOVEDEVICE = 0xE,
DIF_DETECT = 0xF,
DIF_INSTALLWIZARD = 0x10,
DIF_DESTROYWIZARDDATA = 0x11,
DIF_PROPERTYCHANGE = 0x12,
DIF_ENABLECLASS = 0x13,
DIF_DETECTVERIFY = 0x14,
DIF_INSTALLDEVICEFILES = 0x15,
DIF_UNREMOVE = 0x16,
DIF_SELECTBESTCOMPATDRV = 0x17,
DIF_ALLOW_INSTALL = 0x18,
DIF_REGISTERDEVICE = 0x19,
DIF_NEWDEVICEWIZARD_PRESELECT = 0x1A,
DIF_NEWDEVICEWIZARD_SELECT = 0x1B,
DIF_NEWDEVICEWIZARD_PREANALYZE = 0x1C,
DIF_NEWDEVICEWIZARD_POSTANALYZE = 0x1D,
DIF_NEWDEVICEWIZARD_FINISHINSTALL = 0x1E,
DIF_UNUSED1 = 0x1F,
DIF_INSTALLINTERFACES = 0x20,
DIF_DETECTCANCEL = 0x21,
DIF_REGISTER_COINSTALLERS = 0x22,
DIF_ADDPROPERTYPAGE_ADVANCED = 0x23,
DIF_ADDPROPERTYPAGE_BASIC = 0x24,
DIF_RESERVED1 = 0x25,
DIF_TROUBLESHOOTER = 0x26,
DIF_POWERMESSAGEWAKE = 0x27
}

我也是为了自己以后使用查询方便.

再说说我是怎么知道是那两个变量的.

我们再上面我提到的详细信息界面里面看到里面又很多各种各样的信息,这些信息都是可以读取的.至于上面的名称分别读取的哪个,我也不是很清楚,可以到微软取核对,我没用到的就没去核对了.

我上面用的变量名,是这样发现的,我在百度上面搜: 获取串口名称,然后发现了个网址,里面有用vc写的获取设备的友好名称的办法.我看到

然后我又去百度搜

发现这个正是我要的友好名称的变量名.

于是我又去搜这个变量对应的数值.然后就得到了上面的程序.

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...