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恒等于空


}


相关文章
|
10月前
|
Linux API C语言
Qt串口编程探究:理论与实践
Qt串口编程探究:理论与实践
436 1
|
10月前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
715 0
|
10月前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
2060 0
|
10月前
|
存储 C语言 Windows
音视频使用qt测试ffmpeg接口时无法运行
音视频使用qt测试ffmpeg接口时无法运行
173 0
|
10月前
com串口通信测试代码
com串口通信测试代码
77 0
|
Linux
linux系统中利用QT实现串口通信的方法
linux系统中利用QT实现串口通信的方法
414 0
|
8月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
10月前
|
移动开发 开发者
LabVIEW或MAX下的VISA测试面板中串口无法工作
LabVIEW或MAX下的VISA测试面板中串口无法工作
224 1
LabVIEW或MAX下的VISA测试面板中串口无法工作
|
Linux 测试技术 Windows
可编程 USB 转串口适配器开发板应用于电子设备开发测试
可编程 USB 转串口适配器开发板应用于电子设备开发测试
可编程 USB 转串口适配器开发板应用于电子设备开发测试
|
10月前
|
监控 物联网 Linux
python测试串口最大通信速率
【4月更文挑战第5天】
213 3

热门文章

最新文章

推荐镜像

更多