首页 > 其他分享 >VC MFC 实现枚举串口号,并支持串口热插拔功能

VC MFC 实现枚举串口号,并支持串口热插拔功能

时间:2022-11-21 18:12:05浏览次数:48  
标签:NotificationFilter VC szKeyData 热插拔 串口 lResult sizeof GUID

直接上代码

头文件  全局变量声明

//需要头文件
#include <dbt.h>

//声明全局变量
static const GUID GUID_DEVINTERFACE_LIST[] =
{
    // GUID_DEVINTERFACE_USB_DEVICE
    { 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },
    // GUID_DEVINTERFACE_HID, 
    { 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
};


CStringArray m_strArrSerialPort;

 

枚举串口号

BOOL xxxDlg::EnumSerialPort(CStringArray &saCom)
{
    HKEY                hKey;
    DWORD                dwIndex;
    LONG                lResult;
    DWORD                dwType;
    DWORD                dwKeyNameLen;
    CHAR                szKeyName[256];
    DWORD                dwKeyDataLen;
    UCHAR                szKeyData[80];
    CString                strCom, str;
    LPCTSTR                lpSubKey;

    saCom.RemoveAll();

    lpSubKey = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");

    lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);

    if (lResult != ERROR_SUCCESS)
    {
        str.Format(_T("RegOpenKeyEx()函数打开失败!"));
        AfxMessageBox(str);
        return FALSE;
    }

    dwIndex = 0;

    while (1)
    {
        memset(szKeyName, 0x0, sizeof(szKeyName));
        memset(szKeyData, 0x0, sizeof(szKeyData));

        dwKeyNameLen = sizeof(szKeyName);
        dwKeyDataLen = sizeof(szKeyData);

        lResult = RegEnumValue(hKey, dwIndex++, szKeyName, &dwKeyNameLen, NULL, &dwType, szKeyData, &dwKeyDataLen);

        if ((lResult == ERROR_SUCCESS) || (lResult == ERROR_MORE_DATA))
        {
            strCom = (char *)szKeyData;
            saCom.Add(strCom);
        }
        else
        {
            break;
        }
    }

    RegCloseKey(hKey);

    return true;
}

串口插拔消息响应函数

 1 BOOL xxxDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
 2 {
 3     switch (nEventType)
 4     {
 5         //串口被移除  
 6     case DBT_DEVICEREMOVECOMPLETE:
 7         EnumSerialPort(m_strArrSerialPort);
 8         ShowSerialPort();
 9         break;
10         //串口插入或者变为有效
11     case DBT_DEVICEARRIVAL:
12         EnumSerialPort(m_strArrSerialPort);
13         ShowSerialPort();
14         break;
15 
16     default:
17         break;
18     }
19 
20     return TRUE;
21 }

显示到COMBO-BOX控件中

1 void xxxDlg::ShowSerialPort()
2 {
3     ((CComboBox *)GetDlgItem(IDC_COMBO_SerialPort))->ResetContent();
4     for (int i = 0; i < m_strArrSerialPort.GetSize(); i++)
5     {
6         ((CComboBox *)GetDlgItem(IDC_COMBO_SerialPort))->AddString(m_strArrSerialPort.GetAt(i));
7     }
8     ((CComboBox *)GetDlgItem(IDC_COMBO_SerialPort))->SetCurSel(0);
9 }

在OnInitDialog中增加注册插拔消息的代码   并初始化显示串口号

 1     //初始化显示串口
 2         EnumSerialPort(m_strArrSerialPort);
 3         ShowSerialPort();
 4 
 5     //注册插拔事件
 6     HDEVNOTIFY hDevNotify;
 7     DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
 8     ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
 9     NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
10     NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
11 
12     for (int i = 0; i < sizeof(GUID_DEVINTERFACE_LIST) / sizeof(GUID); i++)
13     {
14         NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
15         hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
16         if (!hDevNotify)
17         {
18             return FALSE;
19         }
20     }        

 

标签:NotificationFilter,VC,szKeyData,热插拔,串口,lResult,sizeof,GUID
From: https://www.cnblogs.com/ckrgd/p/16912210.html

相关文章

  • 批量添加esxi主机到Vcenter
    1连接vcenterConnect-VIServer-Protocolhttps-User'[email protected]'-Password'Vcenter密码'-ServerVcenter地址192.168.x.x 2查看Vcenter主机Get-......
  • SpringMVC知识
    1Spring框架Spring框架指的都是SpringFramework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。Spring自带IoC(InverseofControl:控制反转)和A......
  • springmvc 项目启动后自动运行方法
    packagecom.jeeplus.modules.asr.config;importcom.jeeplus.common.config.Global;importcom.jeeplus.modules.asr.netty.server.UDPServer;importcom.jeeplus.modu......
  • SpringMVC - RestFul
    一、RestFul是一个请求路径的风格,将请求参数放在url中以/来分割请求参数。url:/delete/1    1就是参数RestFul的请求方式对应的是不同的操作get : 查询post:......
  • JSP以及MVC模式和三层架构
    jsp:javaserverpages,java服务端页面。它是一种,动态网页技术,其中可以定义html等静态内容,也可以定义java代码等动态内容,可以避免在servlet中用write()直接输出html,但是本质......
  • python安装报错error: pybind11 2.10+ requires MSVC 2017 or newer
    pip安装paddleocr时报错,提示要2017或更高,c:\users\administrator\appdata\local\temp\pip-build-env-86xs2ijc\overlay\lib\site-packages\pybind11\include\pybind11\det......
  • MVC与MTV
    MTV和MVC就是指功能模块划分,django属于标准的MTVMVC:M-->model数据库模型相关V-->Views视图相关C-->Controllers业务逻辑处理 MTVM-->model数......
  • SpringMVC - 获取请求参数,作用域
    一、获取请求参数1.原生serveltAPI@ControllerpublicclassTestController{@RequestMapping("/test01")publicStringtest01(HttpServletRequestrequest){......
  • MVC三层架构、Filter、监听器
    MVC三层架构什么是MVC:ModelViewController模型、视图、控制器早些年用户直接访问控制层,控制层就可以直接操作数据库servlet--CRUD--数据库弊端:程序十分臃肿,不......
  • EasyX图形库安装,以及使用样例(vc6.0,vs2013,其他类同)
    ①​​官网下载​​②解压安装(由于自己电脑安装了vc6.0和vs2013以该两个为例,其他都是一样的安装方法)③图形库测试利用图形库画星空(l编译器vs2013)#include<stdafx.h>#......