QT读取注册表总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题:使用QSettings时,对于注册表中类似于串口信息中的\Device\Serial0的这种key值,用value()函数无法读到其value。

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

解决方法:

.h文件

#ifndef WIDGET_H

#define WIDGET_H

#include

#include

#include

#include

#include

namespace Ui{

class Widget;

}

class Widget:public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget*parent=0);

~Widget();

private:

Ui::Widget*ui;

QStringList m_listcomboName;

HKEY hKey;

LPCWSTR subkey;

wchar_t keyname[256];//键名数组

char keyvalue[256];//键值数组

DWORD keysize,type,valuesize;

int indexnum;

public:

QString getcomm(int index,QString keyorvalue);//读取键名

};

#endif//WIDGET_H

.cpp 文件

#include"widget.h"

#include"ui_widget.h"

Widget::Widget(QWidget*parent):

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

QString path="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\";

QSettings*settings=new QSettings(path,QSettings::NativeFormat);

QStringList key=settings->allKeys();

int num=(int)key.size();

QString value;

for(int i=0;i

{

value=getcomm(i,"value");

m_listcomboName<

}

}

Widget::~Widget()

{

delete ui;

}

QString Widget::getcomm(int index,QString keyorvalue)

//index为索引号,keyorvalue为选择返回值应该为key还是value

{

QString commresult;

if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),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,&value size)==0)//列举键名和值

{

for(int i=0;i

{

message=keyname[i];

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,&val uesize)==0)列举键名和值

return commresult;

::RegCloseKey(hKey);//关闭注册表

}

相关文档
最新文档