读取Windows注册表DWORD值时输出指针地址而非实际值求助
读取注册表DWORD值时输出指针地址的问题修复
问题根源
- 存储类型不匹配:你用
TCHAR value[255]存储DWORD值,但DWORD是32位整数类型,并非字符串。直接输出数组名value时,cout会将其视为字符串指针,打印的是数组的内存地址,而非实际的DWORD数值。 - 缺少错误检查:
RegOpenKey、RegQueryValueEx这类系统API调用可能失败,未做错误处理会掩盖潜在问题。 RegQueryValueEx参数错误:传入的缓冲区类型与REG_DWORD不匹配,且未验证返回的实际类型是否符合预期。
修正后的代码
#include <windows.h> #include <iostream> using namespace std; void registry_read(LPCTSTR subkey, LPCTSTR name, DWORD expected_type) { HKEY key; LONG open_result = RegOpenKey(HKEY_LOCAL_MACHINE, subkey, &key); if (open_result != ERROR_SUCCESS) { cout << "打开注册表键失败,错误码: " << open_result << endl; return; } DWORD value; DWORD value_length = sizeof(DWORD); DWORD actual_type; LONG query_result = RegQueryValueEx(key, name, NULL, &actual_type, (LPBYTE)&value, &value_length); if (query_result != ERROR_SUCCESS) { cout << "读取注册表值失败,错误码: " << query_result << endl; RegCloseKey(key); return; } if (actual_type != expected_type) { cout << "注册表值类型不匹配,预期: " << expected_type << ", 实际: " << actual_type << endl; RegCloseKey(key); return; } cout << "注册表值: " << value << endl; RegCloseKey(key); } int main() { registry_read(TEXT("SOFTWARE\\Valve\\Steam\\ActiveProcess"), TEXT("ActiveUser"), REG_DWORD); return 0; }
关键修正点
- 用
DWORD value替代TCHAR数组,匹配REG_DWORD类型的存储需求 - 新增API调用的错误检查,便于定位调用失败的原因
- 增加类型校验,确保读取到的值类型与预期一致
- 直接输出
value变量,打印的是DWORD的实际数值而非内存地址
内容的提问来源于stack exchange,提问作者Ikozox
相关产品推荐
相关产品推荐

