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

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

ConstantValueDescriptionGoogle 翻译
QSettings::NativeFormat0Store 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::Registry32Format2Windows 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::Registry64Format3Windows 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::IniFormat1Store 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::InvalidFormat16Special value returned by registerFormat().registerFormat() 返回的特殊值

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于Qt_32位程序在64位系统下读取64位注册表的主要内容,如果未能解决你的问题,请参考以下文章

C# 32位程序在64位系统下注册表操作

64位系统下注册32位dll文件

64位 regsrv win10_Regsvr32 在64位机器上的用法

64位 regsrv win10_Regsvr32 在64位机器上的用法

从 32 位应用程序读取 64 位注册表

如何从 32 位进程读取 64 位注册表项?