前段时间做串口开发,想做自动扫描串口设备功能 遇到问题 现在终于解决 程序写得不是很好,功能实现了。按照此方法应该能够扫描到其他硬件。
我遇到的问题:
使用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);//关闭注册表
}
阅读(1739) | 评论(0) | 转发(0) |