前段时间做串口开发,想做自动扫描串口设备功能 遇到问题 现在终于解决 程序写得不是很好,功能实现了。按照此方法应该能够扫描到其他硬件。
我遇到的问题:
使用QSettings时 对于注册表中串口信息中的 \Device\Serial0 这种key值 无法找到其value 是 \ 斜杠问题。
解决方法是 首先调用:
QString path="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
QSettings *settings=new QSettings(path,QSettings::NativeFormat);
QStringList key=settings->allKeys();
int num=(int)key.size();
得到注册表中有多少个串口设备
然后使用win api得到 key 和 value 程序源码如下:QString  getcomm(int index,QString keyorvalue)返回key  或者 value
                                                                                                                       
.h文件
#ifndef READCOM_H
#define READCOM_H
#include <QMessageBox>
#include <qt_windows.h>
#include <QtGui/QMainWindow>
class Readcom
{
public:
    Readcom();
    ~Readcom();
private:    
     HKEY hKey;
     LPCWSTR subkey;
    
     wchar_t keyname[256]; //键名数组
     char keyvalue[256];   //键值数组
     DWORD keysize,type,valuesize;
     int indexnum;
public:
      QString getcomm(int index,QString keyorvalue); //读取键名
      //QString getvalue(int index);//读取键值
    };
#endif // READCOM_H
.cpp 文件
#include "readcom.h"
Readcom::Readcom()    
{
 }
Readcom::~Readcom()
{
}
QString Readcom::getcomm(int index,QString keyorvalue)
{  
    QString commresult="";
    QString strkey="HARDWARE\\DEVICEMAP\\SERIALCOMM";//子键路径
    subkey=strkey.ucs2();//类型转换
    if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
      {
          QString error="Cannot open regedit!";//无法打开注册表时返回error
          return error;
       }//if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ,&hKey)!=0)
   QString keymessage="";//键名
   QString message="";
   QString valuemessage="";//键值
   indexnum=index;//要读取键值的索引号
    keysize=sizeof(keyname);
    valuesize=sizeof(keyvalue);
     if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)//列举键名和值
      {     
           for(int i=0;i<keysize;i++)    
              { 
                 message=keyname;
                 keymessage.append(message);
               }// for(int i=0;i<=keysize;i++)    读取键名
           for(int j=0;j<valuesize;j++)
               {
                 if(keyvalue[j]!=0x00) 
                 { valuemessage.append(keyvalue[j]);}
                }//for(int j=0;j<valuesize;j++) 读取键值
           if(keyorvalue=="key")
             {
               commresult=keymessage;
              }
           if(keyorvalue=="value")
             {
               commresult=valuemessage;
             }
               
     }
     else
     {
         commresult="nokey";
     } //if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0) 列举键名和值
  return commresult;
::RegCloseKey(hKey);//关闭注册表
}