问题描述

QSettings32-bit程序中访问"\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"是可以的,
但是访问不了"\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
64-bit程序中访问上面的都可以。

问题分析

1
Microsoft文档中有相关说明:访问备用注册表视图

访问备用注册表视图

2
QSetting访问注册表问题
发现这两个注册表节点
“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall”
“\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall”
在QSetting加载第一个节点时,会自动重定向到第二个上面
有什么办法正确的访问第一个吗
Win10

用win api关闭重定向即可,操作前关闭,操作后恢复

64位系统下的32位程序是这样的
除非你是多个程序配合开发,否则不建议改

问题解决

在QT下使用msvc或minGW时记得在pro中添加:LIBS += -lsetupapi -ladvapi32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const QString REG_UNINSTALL             = R"(Software\Microsoft\Windows\CurrentVersion\Uninstall\xx)";
const QString REG_WOW6432Node_UNINSTALL = R"(Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\xx)";

auto strSubKeys = { REG_WOW6432Node_UNINSTALL, REG_UNINSTALL };
HKEY hKey = HKEY_LOCAL_MACHINE;
REGSAM samDesired = KEY_ALL_ACCESS;
if (strSubKey.contains("WOW6432Node", Qt::CaseInsensitive)) {
samDesired |= KEY_WOW64_32KEY;
} else {
samDesired |= KEY_WOW64_64KEY;
}
if (RegOpenKeyExA(hKey, strSubKey.toStdString().c_str(), NULL, samDesired, &hKey) == ERROR_SUCCESS) {
DWORD dwSize;
dwSize = sizeof(tchDataDisplayicon);
RegQueryValueExA(hKey, REG_DISPLAYICON, NULL, NULL, (LPBYTE)tchDataDisplayicon, &dwSize);
qDebug() << strSubKey << QString::fromLocal8Bit(tchDataDisplayicon);
}