• 8952阅读
  • 21回复

[讨论]QT访问xp系统注册表时,总是无法读取带"\"键的键值,这个问题该如何解决? [复制链接]

上一主题 下一主题
离线teclimber
 

只看楼主 倒序阅读 楼主  发表于: 2014-01-18
关键词: 问题串口系统
想用QT做个串口编程,让QT自动读取注册表,检查设备,但是QT访问xp系统注册表时,总是无法读取带"\"键的键值。
该如何解决?QT本身做不到吗?
离线roywillow

只看该作者 1楼 发表于: 2014-01-18
你用“\\”或者“/”试试呢?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线teclimber

只看该作者 2楼 发表于: 2014-01-20
回 1楼(roywillow) 的帖子
我都试过了,"\\"被解释为"/",而"/“被当成了目录的标志了。

只看该作者 3楼 发表于: 2014-01-20
回 楼主(teclimber) 的帖子
名称中不能包含“/”或者“\”你不知道么?这应该是常识吧!当你包含时,就会当做路径的分隔符来解释!
如果单独的使用名称而非路径,为什么非得添加“/”或者“\”呢?怎么貌似都不喜欢按常规出牌!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线teclimber

只看该作者 4楼 发表于: 2014-01-20
回 3楼(奋斗ing孩子) 的帖子
我也不想用"\",但是没办法,可恶的windows,非要将注册表中的设备名中用"\",这个问题还没法改变,所以,必须要读带"\"的注册表键值。

只看该作者 5楼 发表于: 2014-01-20
看看别人是怎么写的!


可以参考这个:Qt之开机自启动
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线teclimber

只看该作者 6楼 发表于: 2014-01-20
回 5楼(奋斗ing孩子) 的帖子


这是从xp系统中截图的,里面很多设备都是采用"\"的,所以,这不是问题的关键,现在是一定要读带""\的注册表信息了。
有人说,要用win32的API,但是我不想那么麻烦,想看看QT到底行不行?绝大多数工作QT都做了, 难道就是一个"\"就读不了吗?

只看该作者 7楼 发表于: 2014-01-20
这是我测试的(环境:Win7),完全可以!但是key一般建议不要包含“/”或者“\”,而且很多情况下并不识别带“/”或者“\”的字符串,会当做路径分隔符来解析,因为大多数情况下用的并不是key,而是value!
诸如Linux:使用mkdir Qt/test创建目录,并不是创建一个名为“Qt/test”的目录,而是创建目录“Qt”之后,再在目录“Qt”下创建“test”子目录!

博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线dbzhang800

只看该作者 8楼 发表于: 2014-01-20
Re:回 5楼(奋斗ing孩子) 的帖子
引用第6楼teclimber于2014-01-20 12:46发表的 回 5楼(奋斗ing孩子) 的帖子 :
[图片]
这是从xp系统中截图的,里面很多设备都是采用"\"的,所以,这不是问题的关键,现在是一定要读带""\的注册表信息了。
有人说,要用win32的API,但是我不想那么麻烦,想看看QT到底行不行?绝大多数工作QT都做了, 难道就是一个"\"就读不了吗?

这个,你还是老老实实调用系统API吧。系统相关的东西,Qt没有提供直接支持的多了去了。
离线teclimber

只看该作者 9楼 发表于: 2014-01-20
回 7楼(奋斗ing孩子) 的帖子
我这里的应用是,我让程序自动检测插入到电脑的设备,区分设备的标志就是注册表中的key,设备的key是我可以控制的。所以,第一步读取key,然后找到相应的value,我再通过value,对插入电脑的外部设备进行配置。所以key和value都是需要用到的。先说明注册表的文件时xp系统自动生成,我只是读取他的内容。对于你上面的代码我看,只是用了一个replace("/","\\");"/"和"\\"我都试过了,都是无法读到"\"的。而且并不是value中包含"\,而是key中包含"\"读不到。

只看该作者 10楼 发表于: 2014-01-20
有什么不行的,既然key可以控制,那么就自己控制好了,又不难,很简单的东西,让你搞得这么复杂的!


比如:key支持“\”
1、那么你就将key中的“/”转换为“\”,然后保存到注册表里面!
2、读取key找到相应的value,这里的key怎么存的就怎么读取就好了!

比如:/Devic/Seria0
根据1,将/Devic/Seria0转化为\Devic\Seria0
根据2,读取key:\Devic\Seria0对应的value
读取之后,value即就是/Devic/Seria0对应的值!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线teclimber

只看该作者 11楼 发表于: 2014-01-20
回 10楼(奋斗ing孩子) 的帖子
现在QT的情况是,key不支持"\",按你所说,我写如下代码,    
QSettings *reg =
    new QSettings("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM",QSettings::NativeFormat);
    QString str,str2;
    str = "\\Device\\Serial0";
    str.replace("\","\\");

    reg->setValue(str, "red");
    str2 = reg->value(str).toString();

编译器就编译不过了,因为出现了"\",这并不是一个正确的写法,该如何解决?

只看该作者 12楼 发表于: 2014-01-20
str.replace("\","\\");这是什么意思?“\”这是一个转移符,基础知识。。。
你把那段代码先注释掉试试!图都在那里了,代码贴出来了你还不会修改!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线teclimber

只看该作者 13楼 发表于: 2014-01-20
回 12楼(奋斗ing孩子) 的帖子
还是那句话,在value中用"\\"表示"\"可以,但是在key中,不行。不相信的话,你可以试试,你上面给出的例子,我原本就可以实现,只是在key包含"\",始终就不成功。

只看该作者 14楼 发表于: 2014-01-20
回 13楼(teclimber) 的帖子
不成功难道不会使用其他符号代替“\”么?截图你没看到吗?“/”可以,“\”既然不能用,还非得一个劲的往死胡同钻。。。

写得这么清楚的,支持什么就用什么符号代替就好了,系统不支持的,你还非得用!真无语!!!
好好看看之前怎么回复你的!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线dbzhang800

只看该作者 15楼 发表于: 2014-01-20
Re:回 13楼(teclimber) 的帖子
引用第14楼奋斗ing孩子于2014-01-20 16:06发表的 回 13楼(teclimber) 的帖子 :
不成功难道不会使用其他符号代替“\”么?截图你没看到吗?“/”可以,“\”既然不能用,还非得一个劲的往死胡同钻。。。
写得这么清楚的,支持什么就用什么符号代替就好了,系统不支持的,你还非得用!真无语!!!
好好看看之前怎么回复你的!
[图片]


呵呵,他想要个苹果,你硬要塞给他一个梨?
离线teclimber

只看该作者 16楼 发表于: 2014-01-20
回 14楼(奋斗ing孩子) 的帖子
我已经找到其他的方法在QT下访问带"\"的key了,但绝不是你说的方法。联系了一下Digia,结果人家不对开源用户提供技术支持,也没法确认这个问题。所以跑来想确认一下,这是不是QT的一个bug,暂且当成一个bug吧。还是感谢你的回答,不过你的回答有点不对应我的问题。

只看该作者 17楼 发表于: 2014-01-20
回 15楼(dbzhang800) 的帖子
想要的梨不存在,只好委屈吃苹果了。。。那也没办法!
Qt很多东西都实现不了,如果不转变思维,程序肯定也不好,总不能在一条绳上吊死吧!思维变通对咱们码农来说很重要。。。嘎嘎!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!

只看该作者 18楼 发表于: 2014-01-20
回 16楼(teclimber) 的帖子
这个不清楚。。。是不是Bug你提给Qt,看他们如何回复吧!
其实我回复的已经很清楚了,经过测试,key是不支持“\”的,value支持,所以才要你转换的!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线0xffffh

只看该作者 19楼 发表于: 2014-01-20
没必要那么麻烦,我是这样解决的:
void GetPortsDialog::getAvailabePorts()
{
    QProcess proc;
    QRegExp regPort("(COM\\d+)");
    proc.setProcessChannelMode(QProcess::MergedChannels);
    proc.start("reg query \"HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM\" /s");
    proc.waitForFinished();
    QString res = proc.readAllStandardOutput();
    validPorts.clear();
    int pos = 0;
    while ((pos = regPort.indexIn(res, pos)) != -1)
    {
        if( !validPorts.contains( regPort.cap(1) ) )
            validPorts << regPort.cap(1);
        pos += regPort.matchedLength();
    }
}

PS: Qt5已经默认继承了串口库,且带了enumerator。
离线dbzhang800

只看该作者 20楼 发表于: 2014-01-20
Re:回 15楼(dbzhang800) 的帖子
引用第17楼奋斗ing孩子于2014-01-20 16:39发表的 回 15楼(dbzhang800) 的帖子 :
想要的梨不存在,只好委屈吃苹果了。。。那也没办法!
Qt很多东西都实现不了,如果不转变思维,程序肯定也不好,总不能在一条绳上吊死吧!思维变通对咱们码农来说很重要。。。嘎嘎!

其实,这个东西Qt的文档中说的很明确:

Note that the backslash character is, as mentioned, used by QSettings to separate subkeys. As a result, you cannot read or write windows registry entries that contain slashes or backslashes; you should use a native windows API if you need to do so.

变通没有错,比如 a+b 可以变通 成 b + a,但用 b-a 来替代它就不是变通的问题了。

离线teclimber

只看该作者 21楼 发表于: 2014-01-21
回 20楼(dbzhang800) 的帖子
这段文档在哪?正如上面所说,我要用windows API来做了。
快速回复
限100 字节
 
上一个 下一个