Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2270749
  • 博文数量: 862
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10598
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(862)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2009-04-30 17:43:00

前段时间做串口开发,想做自动扫描串口设备功能 遇到问题 现在终于解决 程序写得不是很好,功能实现了。按照此方法应该能够扫描到其他硬件。
我遇到的问题:
使用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
#include
#include
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             {
                 message=keyname;
                 keymessage.append(message);
               }// for(int i=0;i<=keysize;i++)    读取键名
           for(int j=0;j               {
                 if(keyvalue[j]!=0x00)
                 { valuemessage.append(keyvalue[j]);}
               }//for(int j=0;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);//关闭注册表
}
阅读(1141) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~