基于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
相关产品推荐
相关产品推荐

