Qt_32位程序在64位系统下读取64位注册表
Qt_32位程序在64位系统下读取64位注册表
关键字:
64位系统
32位程序
注册表
Qt
重定向
摘要
今天在生产环境测试时,发现一个有趣的问题,我的程序在运行时会修改注册表,由于用了某个客户的32位库,所以整个项目都换成了32位编译了,开始没有注意注册表的问题,导致把项目部署到生产环境是,显示注册表修改成功了,但是实际没有效果。所以有了今天这个文章
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() 返回的特殊值 |
文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。
原文链接:dreamlife.blog.csdn.net/article/details/125104185
- 点赞
- 收藏
- 关注作者
评论(0)