Qt_32位程序在64位系统下读取64位注册表

举报
DreamLife 发表于 2022/06/04 01:01:26 2022/06/04
【摘要】 Qt_32位程序在64位系统下读取64位注册表 文章目录 Qt_32位程序在64位系统下读取64位注册表摘要1 核心内容2 如何解决Qt编译的32为程序读取64位注册表enum QSetti...
头图

Qt_32位程序在64位系统下读取64位注册表


关键字: 64位系统 32位程序 注册表 Qt 重定向

摘要

今天在生产环境测试时,发现一个有趣的问题,我的程序在运行时会修改注册表,由于用了某个客户的32位库,所以整个项目都换成了32位编译了,开始没有注意注册表的问题,导致把项目部署到生产环境是,显示注册表修改成功了,但是实际没有效果。所以有了今天这个文章

image-20220602170707108

1 核心内容

原文链接:64位Windows系统注册表的32位注册表项和64位注册表项

64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项。许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然。

64 位版本 Windows 包含的默认 64 位版本注册表编辑器 (Regedit.exe) 可显⽰ 64 位和 32 位的注册表项。WOW64 注册表重定向器为 32 位
程序提供了对应于 32 位程序注册表项的不同注册表项。在 64 位版本的注册表编辑器中,32 位注册表项显⽰在以下注册表项下:
HKEY_LOCAL_MACHINE\Software\WOW6432Node使⽤默认的 64 位版本注册表编辑器,可以查看或编辑 64 位和 32 位的注册表项和项
值。要查看或编辑 64 位注册表项,必须使⽤ 64 位版本的注册表编辑器 (Regedit.exe)。还可以使⽤%systemroot%\Syswow64⽂件夹中的
32 位版本注册表编辑器查看或编辑 32 位注册表项和项值。在 32 位版本注册表编辑器中执⾏任务的⽅式与 64 位版本注册表编辑器没有区
别。要打开 32 位版本的注册表编辑器,请按照下列步骤操作:
单击“开始”,然后单击“运⾏”。
在“打开”框中,键⼊%systemroot%\syswow64\regedit,然后单击“确定”。
注意:除⾮使⽤ -m 开关启动注册表编辑器的第⼆个实例,否则,必须先关闭 64 位版本的注册表编辑器,然后才能打开 32 位版本的注册表
编辑器(反之亦然)。例如,如果 64 位版本的注册表编辑器已经在运⾏,在第 2 步键⼊%systemroot%\syswow64\regedit -m可启动 32 位
版本的注册表编辑器。
为了⽀持 32 位和 64 位 COM 注册和程序状态的共存,WOW64 为 32 位程序提供了⼀种备⽤注册表视图。32 位程序会看到与真正的 64
位HKEY_LOCAL_MACHINE\Software树完全分开的 32位HKEY_LOCAL_MACHINE\Software树
(HKEY_LOCAL_MACHINE\Software\WOW6432Node)。这样可以隔HKEY_CLASSES_ROOT,因为此树的每个计算机部分驻留在以下
注册表项内:HKEY_LOCAL_MACHINE\Software为了通过 COM 和其他机制实现 64 位/32 位程序互操作性,WOW64 使⽤了⼀个“注册表
反射器”来在 64 位注册表视图和 32 位注册表视图之间镜像某些注册表项和项值。该反射器是“智能”的,因为它只反射 COM 激活数据。反射
的注册表项WOW64 注册表反射器可能会在反射过程中修改注册表项的内容和项值,⽬的是为了调整路径名等。因此,32 位的内容与 64 位
的内容可能会有所不同。下⾯的注册表项会影射:
HKEY_LOCAL_MACHINE\Software\Classes
HKEY_LOCAL_MACHINE\Software\COM3
HKEY_LOCAL_MACHINE\Software\Ole
HKEY_LOCAL_MACHINE\Software\EventSystem
HKEY_LOCAL_MACHINE\Software\RPC
注:WoW(Windows on Windows)模式 WOW64 是 Windows-32-on-Windows-64

2 如何解决Qt编译的32为程序读取64位注册表

其实也很简单,我最开始在64位编译环境是用的是QSettings settings(EXEPLORERPATH,QSettings::NativeFormat);现在需要切换为QSettings settings(EXEPLORERPATH,QSettings::Registry64Format);就可以了。

enum QSettings::Format

Constant Value Description Google 翻译
QSettings::NativeFormat 0 Store the settings using the most appropriate storage format for the platform. On Windows, this means the system registry; on macOS and iOS, this means the CFPreferences API; on Unix, this means textual configuration files in INI format. 使用最适合平台的存储格式存储设置。在 Windows 上,这意味着系统注册表;在 macOS 和 iOS 上,这意味着 CFPreferences API;在 Unix 上,这意味着 INI 格式的文本配置文件。
QSettings::Registry32Format 2 Windows only: Explicitly access the 32-bit system registry from a 64-bit application running on 64-bit Windows. On 32-bit Windows or from a 32-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7. 仅限 Windows:从在 64 位 Windows 上运行的 64 位应用程序显式访问 32 位系统注册表。在 32 位 Windows 上或从 64 位 Windows 上的 32 位应用程序中,这与指定 NativeFormat 相同。这个枚举值是在 Qt 5.7 中添加的。
QSettings::Registry64Format 3 Windows only: Explicitly access the 64-bit system registry from a 32-bit application running on 64-bit Windows. On 32-bit Windows or from a 64-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7. 仅限 Windows:从 64 位 Windows 上运行的 32 位应用程序显式访问 64 位系统注册表。在 32 位 Windows 上或从 64 位 Windows 上的 64 位应用程序中,这与指定 NativeFormat 相同。这个枚举值是在 Qt 5.7 中添加的。
QSettings::IniFormat 1 Store the settings in INI files. Note that type information is not preserved when reading settings from INI files; all values will be returned as QString. 将设置存储在 INI 文件中。请注意,从 INI 文件中读取设置时不会保留类型信息;所有值都将作为 QString 返回。
QSettings::InvalidFormat 16 Special value returned by registerFormat(). registerFormat() 返回的特殊值

博客签名2021

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/125104185

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。