枚举所有串口,并自动识别硬件变动

news/2024/5/18 23:52:29 标签: 串口, 枚举, vc, 自动识别, 枚举串口

实现枚举全部com port,和自动根据硬件变动更新com port
代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866
枚举com port 通过读注册表实现。
根据硬件更新com port通过响应系统消息WM_DEVICECHANGE 实现。

注:在对话框的messages里面,我并没有找到这个消息,需要自己手动添加。

下面列出实现方法。

在界面上添加一个CComboBox控件,并为其添加一个控制变量m_combobox;

在头文件中添加

public:
    CComboBox m_combobox;
    afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);
    void FindComPort();

在cpp的message map中添加

BEGIN_MESSAGE_MAP(CcomportDlg, CDialogEx)
    ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()

在cpp的DoDataExchange中添加

void CcomportDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, m_combobox);
}

在cpp中添加两个函数

BOOL CcomportDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)  
{  
    if(nEventType==DBT_DEVNODES_CHANGED)  
        FindComPort();  

    return  TRUE;  
}  

注:其中宏定义 DBT_DEVNODES_CHANGED 需要添加头文件 Dbt.h

void CcomportDlg::FindComPort()  
{  
    HKEY   hKey;  
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey)==ERROR_SUCCESS)  
    {  
        TCHAR       szPortName[256], szComName[256];  
        DWORD       dwLong, dwSize;  
        int         nCount  = 0;  

        m_combobox.ResetContent();  
        while(true)  
        {  
            dwLong  = dwSize    = 256;  
            if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)  
                break;  

            m_combobox.InsertString(nCount, szComName);  
            nCount++;  
        }  
        RegCloseKey(hKey);  
        m_combobox.SetCurSel(0);  
    }  
}
#include <Dbt.h>

在cpp的OnInitDialog 中添加FindcomPort();

    // TODO: Add extra initialization here
    FindComPort();

经过vs2010的编译在win7系统下运行正常,可以自动获取电脑的所有com 口,当有硬件变动的时候(我用的测试终端,usb接口,会识别通信com口),会自动刷新com 口列表。

代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866


http://www.niftyadmin.cn/n/1424032.html

相关文章

oracle 没有监听器

一、运行监听器在CMD中输入以下内容.C:\>lsnrctlLSNRCTL for 32-bit Windows: Version 8.1.6.0.0 - Production on 14-3月 -2003 14:17:51(c) Copyright 1998, 1999, Oracle Corporation. All rights reserved. 欢迎来到LSNRCTL&#xff0c;请键入"help"以获得信息…

DNS域名解析 、 WEB服务

回顾 1.共享权限&#xff1a;完全控制、更改、读取 Eveyone默认读取权限 通过网络访问共享的有效权限为NTFS权限与共享权限二者的交集 本地访问仅看NTFS权限 2.FTP文件传输协议&#xff0c;默认端口21 3.搭建FTP服务 1&#xff09;IIS ftp站点默认根目录&#xff1a;c:\inetp…

ORACLE 同义词(Synonyms和DBLinks)

数据库中 用户a 访问 用户b 中表t_department 首先在 库a中建立DBLinks 来链接两个库具体如下&#xff1a; create database link TESTLINK1connect to ACSYS//库b的某个用户名identified by "djzcq"//对应的密码using b;//所在服务器的库命名 然后建立同义词 具…

常见顶级域(一级)

组织域 .com商业 .gov政府 .edu教育 .mil军事 .net网络 .org民间团体组织 .arpa反向域 国家或地区域 .cn中国 .us美国 .ru俄罗斯 .tw中国台湾 .hk中国香港

QT QCompleter的简单使用

需要四个类&#xff1a; QCompleterQLineEditQStringList &#xff08;数据结构、可用其他数据结构&#xff09;QStringListModel &#xff08;数据模型、可用其他数据模型或自定义&#xff09; 做简单的搜索自动补全&#xff0c;使用最简单的数据结构 QStringList和最简单的…

资源解析记录的类别(标识)

A 正向解析 PTR 反向解析 CNAME 别名解析

接口减少程序耦合度

多个类或组件要用到同样的功能&#xff0c;只需实现接口功能 被调用类不需要知道调用类具体是哪个类&#xff0c;只需要调用类实现接口的 将处理的代码封装在实现接口的类中&#xff0c;每个类有不同的处理。 1.接口 public interface ISearch{ void setSearch(string id,…

QT的Paint 系统

下面对于QT的绘制系统做一个简要说明&#xff0c; 这个系统主要由三部分组成&#xff0c; QPainterQPaintDeviceQPaintEngine QPainter 是一个绘制接口类&#xff0c;提供绘制各种面向用户的命令 QPaintDevice 是一个QPainter绘制的目的地&#xff0c;相当于画布 QPaintEng…