You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取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;
}

关键修正点

  1. 用DWORD value替代TCHAR数组,匹配REG_DWORD类型的存储需求
  2. 新增API调用的错误检查,便于定位调用失败的原因
  3. 增加类型校验,确保读取到的值类型与预期一致
  4. 直接输出value变量,打印的是DWORD的实际数值而非内存地址

内容的提问来源于stack exchange,提问作者Ikozox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:49:55