• 19488阅读
  • 5回复

qt4.1.0  读取注册表得到 串口信息的方法! [复制链接]

上一主题 下一主题
离线unforgiver
 

只看楼主 倒序阅读 楼主  发表于: 2008-08-26
— 本帖被 xtfllbl 执行锁定操作(2010-06-12) —
前段时间做串口开发,想做自动扫描串口设备功能 遇到问题 现在终于解决 程序写得不是很好,功能实现了。按照此方法应该能够扫描到其他硬件。
我遇到的问题:
使用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);//关闭注册表
}
离线tumblm
只看该作者 1楼 发表于: 2008-08-26
Re:qt4.1.0  读取注册表得到 串口信息的方法!
不错,以后也要用到通讯接口,届时要请lz不吝赐教啦!
离线gzbenny

只看该作者 2楼 发表于: 2008-11-16
呵呵,运行不了啊,错误提示:缺少VC的运行库,我把VC的运行库加进去也不行
离线wu_java
只看该作者 3楼 发表于: 2009-11-21
Re:qt4.1.0  读取注册表得到 串口信息的方法!
当电脑上插有usb-RS232串口线时,你的这招就不灵了
离线wu_java
只看该作者 4楼 发表于: 2009-11-21
Re:qt4.1.0  读取注册表得到 串口信息的方法!
不对,用在笔记本电脑上就有很多麻烦了
有一些COM口并不给你对外通信
离线kylin9973
只看该作者 5楼 发表于: 2010-06-11
Re:qt4.1.0  读取注册表得到 串口信息的方法!
可以试试开源类 <QextSerialPort>  和 <QextSerialEnumerator> , USB串口也可以正确枚举。