Qt通过注册表枚举串口(winXP和win7测试通过)

简介: Qt通过注册表枚举串口(winXP和win7测试通过)

源文件:


#include "prjini.h"

#include <qsettings.h>


#include <QStringList>

#if defined(Q_OS_WIN32)

#include <qt_windows.h>//必须添加windows的头文件

#endif




QStringList QPrjIni::getCOMPorts_win(void)//Qt通过windows相关的注册表函数实现枚举串口

{

   QStringList comList;


#if defined(Q_OS_WIN32)


   HKEY hKey;

   LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM\\"), 0, KEY_READ, &hKey);

   if (ret != ERROR_SUCCESS)

   {

       return comList;//错误:无法打开有关的hKEY

   }


   DWORD dwIndex = 0;

   LONG Status = 0;

   wchar_t ckeyName[512] = {0};

   char ckeyValue[100] = {0};

   DWORD szName = 0;

   DWORD szValue = 0;

   DWORD type = 0;

   QString str1;

   QString str2;


   while (1)

   {

       szName = sizeof(ckeyName);//注意,因为szName每读一次key,数值就变化一次,所以每次必须重新初始化,否则长度若不足,会出现ERROR_MORE_DATA的错误

       szValue = sizeof(ckeyValue);//与szName相同

       Status = RegEnumValue(hKey, dwIndex++, ckeyName, &szName, 0, &type, (BYTE*)ckeyValue, &szValue);


       if (Status == ERROR_SUCCESS)

       {

           //初始化

           str1 = "";

           str2 = "";


           //求出键的名称

           for (DWORD i = 0; i < szName; i++)

           {

               str1.append(ckeyName[i]);

           }


           //求出键的数值

           for (DWORD i = 0; i < szValue; i++)

           {

               if (ckeyValue[i] != 0)//必须跳过0,例如"COM1"在ckeyValue数组储存的是"C0O0M010"

               {

                   str2.append(ckeyValue[i]);

               }

           }


           //根据键的数值判断是否COM

           if (str2.indexOf("COM") != -1)

           {

               comList.append(str2);

           }

       }

       else//ERROR_MORE_DATA(234),ERROR_NO_MORE_ITEMS(259)

       {

           break;

       }

   }


   RegCloseKey(hKey);


#endif


   return comList;

}




也许有人会问,为什么不使用Qt4自身的函数读注册表?原因如下:


Qt4在读取注册表时,对于有路径分隔符“\”,“/”的value都无法读取,应该属于Qt4的一个bug。


例如注册表键名称为"\Device\Serial0"的数值,读取恒等于空。


QSettings reg("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM", QSettings::NativeFormat);


QStringList keyList = reg.childKeys();


QString tmp;


foreach(QString key, keyList)

{


tmp = reg.value(key).toString();//tmp恒等于空


}


相关文章
|
2月前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
63 0
|
2月前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
120 0
|
2月前
|
Linux API C语言
Qt串口编程探究:理论与实践
Qt串口编程探究:理论与实践
65 1
|
25天前
|
监控 物联网 Linux
python测试串口最大通信速率
【4月更文挑战第5天】
|
2月前
|
存储 缓存
【Qt 全局属性相关】 Qt 应用程序行为的全局属性 Qt::ApplicationAttribute枚举解析
【Qt 全局属性相关】 Qt 应用程序行为的全局属性 Qt::ApplicationAttribute枚举解析
22 0
|
3月前
|
编解码 IDE 开发工具
QT案例IDE编写 -- 通过枚举实现编码切换
QT案例IDE编写 -- 通过枚举实现编码切换
13 0
|
5月前
|
Ubuntu Linux Windows
串口模拟工具实现测试
串口模拟工具实现测试
79 0
|
7月前
|
API
QT学习—属于自己的串口调试助手
本文详细介绍了如何编写一个属于自己的串口助手。
76 3
|
11月前
QT上位机串口+STM32单片机项目(二)
QT上位机串口+STM32单片机项目
165 0

推荐镜像

更多