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

基于MSDN指南,使用C语言读取自定义Windows注册表项的问题

补全并完善读取自定义注册表值的C代码

嘿,看你正在照着MSDN指南折腾注册表读取,已经在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion路径下加了个叫Test的自定义注册表值,代码写到一半卡在RegGetValue的参数部分了对吧?我来帮你把代码补全,还会给你讲清楚关键细节:

#include <stdio.h>
#include <Windows.h>

int rd() {
    DWORD dataSize = 0;
    LONG result;
    // 假设你的Test是字符串类型,要是是DWORD等其他类型,这里得调整缓冲区类型
    WCHAR valueBuffer[256] = {0};

    // 第一步:先获取值的大小(不确定值的类型和大小时,这步很必要)
    result = RegGetValue(
        HKEY_LOCAL_MACHINE,
        L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
        L"Test",
        RRF_RT_ANY, // 接受任意类型的注册表值,要是知道类型可以改成对应标记,比如RRF_RT_DWORD
        NULL, // 不需要获取值的类型信息就传NULL
        NULL, // 先不传缓冲区,只拿数据大小
        &dataSize // 用来存数据大小的变量
    );

    if (result != ERROR_SUCCESS && result != ERROR_MORE_DATA) {
        printf("获取值大小失败,错误码:%ld\n", result);
        return -1;
    }

    // 第二步:用拿到的大小读取实际值
    result = RegGetValue(
        HKEY_LOCAL_MACHINE,
        L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
        L"Test",
        RRF_RT_ANY,
        NULL,
        valueBuffer,
        &dataSize
    );

    if (result == ERROR_SUCCESS) {
        // 这里按字符串类型输出,要是是DWORD类型,换成printf("读取到Test值:%lu\n", valueBuffer)
        wprintf(L"读取到Test值:%s\n", valueBuffer);
    } else {
        printf("读取值失败,错误码:%ld\n", result);
        return -1;
    }

    return 0;
}

int main() {
    return rd();
}

几个关键细节要注意:

  • 注册表值类型匹配:如果你的Test不是字符串类型(比如是DWORD数值),得把缓冲区改成DWORD valueBuffer,输出的时候用printf替代wprintf,同时把RRF_RT_ANY改成RRF_RT_DWORD更精准。
  • 64位系统兼容:要是你在64位系统上编译32位程序,可能会出现读不到值的情况——这时候要加上RRF_WOW64_64KEY(读取64位注册表)或者RRF_WOW64_32KEY(读取32位注册表)标记,比如把RRF_RT_ANY改成RRF_RT_ANY | RRF_WOW64_64KEY。
  • 错误处理:代码里加了错误码判断,方便你排查问题,MSDN上能查到每个错误码对应的具体原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:02:47