win32-注册表-32位-64位-读写值-Qt-C++

文章目录

1.32访问64位和64位访问32位

32位的应用程序想访问64位的注册表视图的标志是KEY_WOW64_64KEY,该标志的值是0x0100。64位的应用程序想访问32位的注册表视图的标志是KEY_WOW64_32KEY。以上两个标志可以在RegCreateKeyEx()函数、RegDeleteKeyEx()函数和RegOpenKeyEx()函数中指定。

cpp 复制代码
LONG lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\***", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);

范例,32位读取64位注册表。

cpp 复制代码
//写注册表信息
static bool SetRegValue(const std::string& item, const std::string& value) {
	HKEY hkey = nullptr;
	LSTATUS res = ::RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Corel\\Setup\\CorelDRAW Graphics Suite 2019", 0, KEY_WRITE | KEY_WOW64_64KEY, &hkey);
	if (res != ERROR_SUCCESS) {
		res = ::RegCreateKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Corel\\Setup\\CorelDRAW Graphics Suite 2019", &hkey);
	}
	if (res != ERROR_SUCCESS) {
		if (hkey != nullptr) {
			::RegCloseKey(hkey);
			hkey = nullptr;
		}
		return false;
	}
	res = ::RegSetValueExA(hkey, item.c_str(), 0, REG_SZ, (BYTE*)value.c_str(), value.length());
	if (res != ERROR_SUCCESS) {
		return false;
	}
	return true;
}

//读取注册表信息
static std::string GetRegValue(const std::string& item) {
	HKEY hkey = nullptr;
	LSTATUS res = ::RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Corel\\Setup\\CorelDRAW Graphics Suite 2019", 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
	if (res != ERROR_SUCCESS) {
		if (hkey != nullptr) {
			::RegCloseKey(hkey);
			hkey = nullptr;
		}
		return "";
	}
	DWORD type = REG_SZ;
	DWORD size = 0;
	res = ::RegQueryValueExA(hkey, item.c_str(), 0, &type, nullptr, &size);
	if (res != ERROR_SUCCESS || size <= 0) {
		return "";
	}
	std::vector<BYTE> value_data(size);
	res = ::RegQueryValueExA(hkey, item.c_str(), 0, &type, value_data.data(), &size);
	if (res != ERROR_SUCCESS) {
		return "";
	}
	return std::string(value_data.begin(), value_data.end());
}

2.在Qt中qsetting的使用

32程序访问64位注册表,必须使用QSettings::Registry64Format标志,而不能简单使用本地标志QSettings::NativeFormat。

cpp 复制代码
QString regPos = QString::fromLocal8Bit("HKEY_LOCAL_MACHINE/SOFTWARE/Corel/Setup/CorelDRAW Graphics Suite 2019");
regPos.replace("/", "\\");
QSettings tQSettings(regPos, QSettings::Registry64Format);//32程序访问64位注册表-必须采用这种方式
QString destination = tQSettings.value("Destination").toString();

3.总结

注册表,是windows系统保存配置的地方,64位系统为了兼容32位,又做了许多兼容的设计,才出现了这些过渡的配置。

相关推荐
AI-好学者36 分钟前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
其实防守也摸鱼2 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚2 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7252 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋2 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
旖-旎3 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Database_Cool_3 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾3 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
Darkwanderor4 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽8084 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范