目的:获取Windows系统中的所有可用和在用串口

方法:注册表查询法

优点:简单、实用、快速、无遗漏,无多余结果。

说明:另外还有8种方法可以枚举串口,但都不如此法。

代码和详细注释如下:

//---------------------------------------------------------------------------
// 枚举串口
void __fastcall TForm1::BtnEnumClick(TObject *Sender)
{
// 清除信息提示区
Memo1->Clear(); // 清空串口列表, sg 是 TStringGrid 对象
sg->Clear();
sg->Cells[0][0] = L"串口物理名称";
sg->Cells[1][0] = L"串口逻辑名称"; // 就是 COM1, COM2 之类的 // 列标题居中对齐
sg->Alignments[0][0] = taCenter;
sg->Alignments[1][0] = taCenter; // 创建注册表对象
std::auto_ptr<TRegistry> Registry(new TRegistry(KEY_READ));

try
{
// 注册表根路径
Registry->RootKey = HKEY_LOCAL_MACHINE; // 打开串口设备所在的注册表路径
bool bResult = Registry->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false); // 若打开注册表失败,提示信息,直接返回
if (!bResult) {
ShowHint("注册表路径不存在.");
return;
} // 数据项(名称)列表,就是串口物理名称列表
std::auto_ptr<TStringList> ItemNameList(new TStringList()); // 获取数据项(名称)列表,就是串口物理名称列表
Registry->GetValueNames(ItemNameList.get()); // 单个数据项的名称和值 (字符串形式),值的字符串形式就是串口逻辑名称,就是COM1, COM2 之类的
UnicodeString sItemName, sItemValue; // 逐个获取数据项值 (字符串形式)
for (int i = 0; i < ItemNameList->Count; i++)
{
// 当前数据项名称,也就是串口物理名称
sItemName = ItemNameList->Strings[i]; // 读取对应的数据项值 (字符串形式),也就是串口逻辑名称
sItemValue = Registry->ReadString(sItemName); // 显示串口物理名称和串口逻辑名称
//ShowHint(sItemName + "\t" + sItemValue);
// sg 是 TStringGrid 对象
sg->Cells[0][i + 1] = sItemName;
sg->Cells[1][i + 1] = sItemValue;
sg->AutoSizeColumns(true, 0);
} // 关闭会产生写入操作
//Registry->CloseKey();
}
// 在读取注册表时发生异常
catch(...) {
ShowHint("在读取注册表时发生异常.");
}
}
//---------------------------------------------------------------------------

以下是程序运行结果:

说明1:若只想获得可用(空闲)串口,还得逐个打开上述串口,成功打开的是可用(空闲)串口,否则为在用(被其它程序占用的)串口。

说明2:若要支持热插拔串口,还需响应 WM_DEVICECHANGE 消息。

枚举串口的各种方法对比

枚举串口方法

说明

EnumPorts

能够获得历史上曾经在系统中存在过的所有串口,不实用

WMI

无法获取纯粹用软件虚拟出来的串口,例如VSPD串口

注册表

简便、实用、快速,无遗漏,无多余

SetupAPI

GUID_DEVINTERFACE_COMPORT

结果同注册表法,但结果信息太详细,能够分辨出串口类型是纯软件虚拟的,还是蓝牙虚拟的,还是USB虚拟的,等等。

SetupAPI

Ports Device   information set

结果同注册表法,但结果信息太详细,能够分辨出串口类型是纯软件虚拟的,还是蓝牙虚拟的,还是USB虚拟的,等等。

GetDefaultCommConfig

结果有遗漏

QueryDosDevice

结果同注册表法,

文件读写法

结果同注册表法,但要尝遍255个串口,效率太低。

获取Windows系统中的所有可用和在用串口的更多相关文章

  1. Pyqt 获取windows系统中已安装软件列表

    开始之前的基础知识 1. 获取软件列表 在Python的标准库中,_winreg可以操作Windows的注册表.获取已经安装的软件列表一般是读去windows的注册表: SOFTWARE\Micros ...

  2. 这段百度问答,对我相关有对啊!!!----如何获取Windows系统登陆用户名

    如何获取Windows系统登陆用户名 http://zhidao.baidu.com/link?url=Hva9PkVwYZv8KSEWftSqTWe8fqM1dhoq59BurnfADmcOvFjF ...

  3. Windows系统中CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

  4. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  5. 通过PowerShell获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...

  6. 快速获取Windows系统上的国家和地区信息

    Windows系统上包含了200多个国家和地区的数据,有时候编程需要这些资料.以下代码可以帮助你快速获取这些信息.将Console语句注释掉,可以更快的完成分析. static void Main(s ...

  7. Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件

    由于公司现阶段大多数应用软件都是基于Windows系统开发和部署,很多软件安装部署都是在windows server 2012.windows server 2008之类的服务器上,部门同事每次测试一 ...

  8. [源码]一键获取windows系统登陆密码vc6版源码

    [源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...

  9. C/C++获取Windows系统CPU和内存及硬盘使用情况

    //1.获取Windows系统内存使用率 //windows 内存 使用率 DWORD getWin_MemUsage(){ MEMORYSTATUS ms; ::GlobalMemoryStatus ...

随机推荐

  1. HTML5标签总结笔记

    HTML5标签笔记 1.格式标签 元素名和属性一般不区分大小写,特殊的如id和class需要区分 格式标签: <acronym> 定义只取首字母的标签 <abbr>定义缩写 & ...

  2. Android系统匿名共享内存(Anonymous Shared Memory)Java调用接口分析

    一.Ashmem驱动程序 ~/Android/kernel/goldfish ----include ----linux ----ashmem.h ----mm ----ashmem.c 驱动程序具体 ...

  3. Gradle笔记——构建基础

    本篇文章主要介绍一下Gradle的构建基础. 它看起来似乎和android项目没多大关系.不能让人一下子理解android项目中的Gradle配置文件,可是这篇基础真的非常重要. 学习Gradle前, ...

  4. 在linux上手动搭建svn服务器

    svn服务器的搭建 环境: linux CentOS 7 安装: 1.安装svn服务器 yum install subversion 2.查看版本 svnserve --version 3.创建版本库 ...

  5. 求前n个素数(C++)

    输入一个输n,输出前n个素数. #include<iostream> #include <math.h> using namespace std; class Sushu { ...

  6. 在PowerShell脚本中集成Microsoft Graph

    作者:陈希章 发表于2017年4月23日 我旗帜鲜明地表态,我很喜欢PowerShell,相比较于此前的Cmd Shell,它有一些重大的创新,例如基于.NET的类型系统,以及管道.模块的概念等等.那 ...

  7. 关于UTF8文件带BOM头可能会引起的错误解析

    今天在做一个文件上传的项目中碰到了一个十分奇怪的问题,在解析上传上来的csv文件时,总是在解析第一行的第一个标题字段时出错,就是第一个那个字段总是和对应的model字段对应不上,这个坑是真的很深,找了 ...

  8. Spring Boot实战之逐行释义HelloWorld

    一.前言  研究Spring boot也有一小段时间了,最近会将研究东西整理一下给大家分享,大概会有10~20篇左右的博客,整个系列会以一个简单的博客系统作为基础,因为光讲理论很多东西不是特别容易理解 ...

  9. MyBatis SQL处理大于、小于号

    MyBatis mapper文件是xml文件,需要特殊字符如大于号.小于号后需要转义. 原字符 转义后字符 < < <= <= > > > >=

  10. JavaSe:UncaughtExceptionHandler

    Java中,出现对于异常的处理,通常是使用try{}catch()来捕获处理的.但是在使用trycatch时,未必会将所有的异常都捕获到,所以方法声明时可以有throws xxxException. ...