QT读取注册表总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);//关闭注册表 }