QT 操作注册表

时间:2022-09-05 09:10:37
小弟是个学生,今晚总算领教到QT的强大了。。。用QT就是一遇到问题百度基本没答案。。。像LZ这种英语刚过2级的人面对全英文的QT文档简直看天书一样。。。好吧不废话。。

写了一个小程序,原本想通过QT来新建一个注册表项的

QString path = "HKEY_CLASSES_ROOT\\CLSID\\{344BBE69-28A4-4536-93A3-C5412A34A3E0}";
QSettings reg(path, QSettings::NativeFormat);
reg.setValue("Maple", "");

原本是这样写的,帮助文档上也说了,如果该项不存在,将会自动创建,我不知道是我写错了,还是我理解错了,还是win7下权限不够的原因?
这个问题上我百度了4个小时都没有结果。。(LZ是一个非常菜的菜鸟)

然后我蛋碎了,决定用C++的方法来写,百度了一下,找到了一个API:
于是又了以下代码

QString path = "CLSID\\{344BBE69-28A4-4536-93A3-C5412A34A3E0}";
WCHAR pathfile[100];
path.toWCharArray(pathfile);
HKEY hKey;
RegCreateKey(HKEY_CLASSES_ROOT, pathfile, &hKey)

也#include <Windows.h>
可是居然报错说

Test.obj:-1: 错误:LNK2019: 无法解析的外部符号 __imp__RegCreateKeyExW@36,该符号在函数 "private: void __thiscall Test::exec(void)" (?exec@Test@@AAEXXZ) 中被引用

debug\Test_Kongjian.exe:-1: 错误:LNK1120: 1 个无法解析的外部命令

//后面百度说RegCreateKey不太好,所以改用了RegCreateKeyEx


代码没写错,可是为什么会报错啊?怀疑是链接库啊,神马dll的,MSDN也查看了,相关的库和dll文件也找来了,可是就是不知道怎么连接上去,网上的各种说法也试了,都不行。。



求大神介绍一下QSettings怎么创建注册表项?顺便解答一下为什么Qt使用了Windows的API就说无法析解新符号了?

各位大神,小弟真心急,看在我已经从晚上7点吃完晚饭洗完澡开始来搞这个搞到现在都还没有弄好的份上可怜可怜小弟。。

http://zhidao.baidu.com/question/488441340.html顺便吐槽一下这些百度提问,回答了跟没回答有区别么!

8 个解决方案

#1


首先 创建一个新的 空白的工程,编译运行一下。
看你的错误,可能是编译器混用的缘故。
QSetting 在 Windows 下会在注册表中指定的位置读写。读取整个注册表会使你的程序移植性变差,不推荐。。

读写注册表 是 Windows 平*有的。如果想要更完全的控制,需要 自己调用 WinAPI 搞定。

#2


链接错误,是因为WIN API中修改注册表的函数需要一个LIB.名字我记不得,你查下MSDN。
我前天才写了一个修改系统环境变量的程序。我用的windows的API,用的qt的gui。
后来遇到WIN7上面的UAC控制问题,写权限不够。不能修改注册表。但是可以读。
微软使用manifest文件来指定exe文件的默认的运行权限。VS可以设置manifest文件,但是我用的是QT CREATOR配合MSVC2010编译器,不能手动修改manifest文件,所以编译后运行的程序不能获得系统管理员权限。导致无法修改注册表。在网上搜索了下,什么导入RC资源文件,在.pro里面假如命令都没有成功。最后我想manifest默认是asInvoker,就是和调用者一样的权限。所以就以“管理员权限”运行qt creator。在Creator中运行编译后的exe文件,成功的修改了注册表。 QT 操作注册表
realese时,先生成exe文件。再使用win SDK的mt.exe工具把修改后的manifest打包到exe文件中。这时exe文件会被加上一个盾牌的图标,win7启动它时,会自动弹出确认框,让用户授予管理员权限。

#3


需要这个库advapi32.dll
你弄了几个小时算啥,我弄了几乎一天才弄好。 QT 操作注册表
权限弄死人了。用VS就舒服了,直接可以设置。该死的微软只疼自己的孩子。

#4


引用 3 楼 coblan 的回复:
需要这个库advapi32.dll
你弄了几个小时算啥,我弄了几乎一天才弄好。
权限弄死人了。用VS就舒服了,直接可以设置。该死的微软只疼自己的孩子。


嗯,我看MSDN的时候知道了,我本机安装了VS2010,于是我就直接搜索这个库,天杀的这个库居然还有两个,同名,大小不一时间也不一样,不知道用那个。。

顺带问一下怎么把这个库链接到工程里面?

#5


引用 1 楼 dext 的回复:
首先 创建一个新的 空白的工程,编译运行一下。
看你的错误,可能是编译器混用的缘故。
QSetting 在 Windows 下会在注册表中指定的位置读写。读取整个注册表会使你的程序移植性变差,不推荐。。

读写注册表 是 Windows 平*有的。如果想要更完全的控制,需要 自己调用 WinAPI 搞定。


额,我就是创建空白工程来写的。。。不过谢谢你的回答,最后一句学习到了!

#6


引用 2 楼 coblan 的回复:
链接错误,是因为WIN API中修改注册表的函数需要一个LIB.名字我记不得,你查下MSDN。
我前天才写了一个修改系统环境变量的程序。我用的windows的API,用的qt的gui。
后来遇到WIN7上面的UAC控制问题,写权限不够。不能修改注册表。但是可以读。
微软使用manifest文件来指定exe文件的默认的运行权限。VS可以设置manifest文件,但是我……


QT 操作注册表我现在连编译都通不过。。不过你的回答很详细,为我后续需要生成exe提供了一个思路,万分感谢!

#7


你用的是QT creator还是 vs啊。
如果你使用QT creator添加链接库是在.pro文件中添加。
LIBS+=Advapi32.lib
如果你用MSVC2010的编译器的话,应该是能自动找到这个库的。如果使用MingW,我试了下,还需要去设置库路径。我也懒得弄了。

#8


引用 7 楼 coblan 的回复:
你用的是QT creator还是 vs啊。
如果你使用QT creator添加链接库是在.pro文件中添加。
LIBS+=Advapi32.lib
如果你用MSVC2010的编译器的话,应该是能自动找到这个库的。如果使用MingW,我试了下,还需要去设置库路径。我也懒得弄了。


考。。。
你也许不知道。。我装了VS2010,我直接在C盘里面搜索AdvAPI32.Lib,搜出了3个文件,同名,不同大小。昨晚想过可能是因为文件不一样。。
今天看见你这么一说,我就回去把163k的AdvAPI32.Lib换成了176k的AdvAPI32.Lib
居然就通过编译了。。吭。。。

#1


首先 创建一个新的 空白的工程,编译运行一下。
看你的错误,可能是编译器混用的缘故。
QSetting 在 Windows 下会在注册表中指定的位置读写。读取整个注册表会使你的程序移植性变差,不推荐。。

读写注册表 是 Windows 平*有的。如果想要更完全的控制,需要 自己调用 WinAPI 搞定。

#2


链接错误,是因为WIN API中修改注册表的函数需要一个LIB.名字我记不得,你查下MSDN。
我前天才写了一个修改系统环境变量的程序。我用的windows的API,用的qt的gui。
后来遇到WIN7上面的UAC控制问题,写权限不够。不能修改注册表。但是可以读。
微软使用manifest文件来指定exe文件的默认的运行权限。VS可以设置manifest文件,但是我用的是QT CREATOR配合MSVC2010编译器,不能手动修改manifest文件,所以编译后运行的程序不能获得系统管理员权限。导致无法修改注册表。在网上搜索了下,什么导入RC资源文件,在.pro里面假如命令都没有成功。最后我想manifest默认是asInvoker,就是和调用者一样的权限。所以就以“管理员权限”运行qt creator。在Creator中运行编译后的exe文件,成功的修改了注册表。 QT 操作注册表
realese时,先生成exe文件。再使用win SDK的mt.exe工具把修改后的manifest打包到exe文件中。这时exe文件会被加上一个盾牌的图标,win7启动它时,会自动弹出确认框,让用户授予管理员权限。

#3


需要这个库advapi32.dll
你弄了几个小时算啥,我弄了几乎一天才弄好。 QT 操作注册表
权限弄死人了。用VS就舒服了,直接可以设置。该死的微软只疼自己的孩子。

#4


引用 3 楼 coblan 的回复:
需要这个库advapi32.dll
你弄了几个小时算啥,我弄了几乎一天才弄好。
权限弄死人了。用VS就舒服了,直接可以设置。该死的微软只疼自己的孩子。


嗯,我看MSDN的时候知道了,我本机安装了VS2010,于是我就直接搜索这个库,天杀的这个库居然还有两个,同名,大小不一时间也不一样,不知道用那个。。

顺带问一下怎么把这个库链接到工程里面?

#5


引用 1 楼 dext 的回复:
首先 创建一个新的 空白的工程,编译运行一下。
看你的错误,可能是编译器混用的缘故。
QSetting 在 Windows 下会在注册表中指定的位置读写。读取整个注册表会使你的程序移植性变差,不推荐。。

读写注册表 是 Windows 平*有的。如果想要更完全的控制,需要 自己调用 WinAPI 搞定。


额,我就是创建空白工程来写的。。。不过谢谢你的回答,最后一句学习到了!

#6


引用 2 楼 coblan 的回复:
链接错误,是因为WIN API中修改注册表的函数需要一个LIB.名字我记不得,你查下MSDN。
我前天才写了一个修改系统环境变量的程序。我用的windows的API,用的qt的gui。
后来遇到WIN7上面的UAC控制问题,写权限不够。不能修改注册表。但是可以读。
微软使用manifest文件来指定exe文件的默认的运行权限。VS可以设置manifest文件,但是我……


QT 操作注册表我现在连编译都通不过。。不过你的回答很详细,为我后续需要生成exe提供了一个思路,万分感谢!

#7


你用的是QT creator还是 vs啊。
如果你使用QT creator添加链接库是在.pro文件中添加。
LIBS+=Advapi32.lib
如果你用MSVC2010的编译器的话,应该是能自动找到这个库的。如果使用MingW,我试了下,还需要去设置库路径。我也懒得弄了。

#8


引用 7 楼 coblan 的回复:
你用的是QT creator还是 vs啊。
如果你使用QT creator添加链接库是在.pro文件中添加。
LIBS+=Advapi32.lib
如果你用MSVC2010的编译器的话,应该是能自动找到这个库的。如果使用MingW,我试了下,还需要去设置库路径。我也懒得弄了。


考。。。
你也许不知道。。我装了VS2010,我直接在C盘里面搜索AdvAPI32.Lib,搜出了3个文件,同名,不同大小。昨晚想过可能是因为文件不一样。。
今天看见你这么一说,我就回去把163k的AdvAPI32.Lib换成了176k的AdvAPI32.Lib
居然就通过编译了。。吭。。。