使用QSettings读取Windows注册表MachineGuid键遇异常问题求助
解决QSettings读取Windows注册表MachineGuid返回异常的问题
我之前也踩过这个坑!大概率是32位/64位注册表重定向在搞鬼,给你拆解下原因和可行的解决办法:
问题根源
如果你的Qt程序是32位编译版本,在64位Windows系统中,访问HKEY_LOCAL_MACHINE\SOFTWARE会被系统自动重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node分支。而MachineGuid实际存储在64位的SOFTWARE分支里,所以你当前的代码其实读的是一个不存在的键,自然返回异常。
解决办法
方法1:指定注册表访问架构(Qt 5.12+ 推荐)
从Qt 5.12开始,QSettings支持指定注册表的访问架构,直接指定读取64位注册表分支即可:
QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography", QSettings::NativeFormat, QSettings::Registry64); QString machineGuid = settings.value("MachineGuid").toString();
方法2:编译为64位程序
如果你的项目没有32位兼容性需求,直接把Qt程序编译成64位版本。此时访问HKEY_LOCAL_MACHINE\SOFTWARE不会被重定向,你原来的代码就能正常读取到MachineGuid。
方法3:旧版本Qt的兼容方案(Qt <5.12)
如果你的Qt版本低于5.12,没有Registry64枚举值,可以直接调用Windows原生API读取,指定KEY_WOW64_64KEY参数来访问64位注册表:
#include <windows.h> #include <QString> QString getMachineGuid() { HKEY hKey; LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, &hKey); if (result != ERROR_SUCCESS) { return QString(); } WCHAR buffer[256]; DWORD bufferSize = sizeof(buffer); result = RegQueryValueExW(hKey, L"MachineGuid", nullptr, nullptr, (LPBYTE)buffer, &bufferSize); RegCloseKey(hKey); if (result == ERROR_SUCCESS) { return QString::fromWCharArray(buffer); } return QString(); }
验证小技巧
可以先打印当前QSettings实例能读取到的所有键,确认是否被重定向:
qDebug() << settings.allKeys();
如果输出里没有MachineGuid,就说明确实是注册表重定向导致的路径错误。
内容的提问来源于stack exchange,提问作者mostafaTmj
相关产品推荐
相关产品推荐

