不多说,看下面代码。
#include <stdio.h>
#include <windows.h>
#include <winreg.h>
HKEY hKEY; //用于承接返回的句柄
long regOpenResult; //注册表打开及查询后返回的结果集,用于判断
DWORD dataType;
DWORD dataSize = 255; //测试环境数值写死,生产环境不建议这么使用,
//由于dataSize是个未知数,建议使用前先利用
//RegQueryValueEx函数查询后再使用
DWORD data;
void main(void)
{
regOpenResult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full", 0, KEY_READ, &hKEY);
if (regOpenResult == ERROR_SUCCESS)
{
if (RegQueryValueExA(hKEY, "Release", NULL, &dataType, (LPBYTE)&data, &dataSize) == ERROR_SUCCESS)
{
printf("%d", data);
}
else
{
printf("读取失败");
}
}
else
{
printf("未找到该路径!");
}
RegCloseKey(hKEY); // 程序结束前要关闭已经打开的 hKEY
}
注:上方代码经测试,可以正常运行 且 正确读取到数据值
说两个值得注意的关键点。
第一,用于承接返回数据的类型必须是DWORD,不能是char 、TCHAR或其他类型。
第二,在函数的形参中,使用RegQueryValueEx()函数时不能直接使用上方定义的形参,
而是取址使用。
例如下方的
RegQueryValueExA(hKEY, "Release", NULL, &dataType, (LPBYTE)&dwValue, &dataSize)
括号里的内容可以忽略
(这里为什么不使用RegQueryValueEx()而是使用RegQueryValueExA()就简单说一下缘由,
使用RegQueryValueExA()
在参数中使用字符串时不会报:"const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容;具体原因自己make吧。
当然也可以不用,前提是不报错)
下图为解决之前的乱码图。
解决方案为上方两条注意的关键点。
附上解决后的成功图
网上很多帖子,都没有经过真实环境测试就往上贴,千篇一律,甚至有的改都没改就直接贴。
关于RegQueryValueEx()函数的第五个参数使用,网上很多帖子都是没有&,直接使用声明的变量。
一定要Get到这个点,因为这个点走了很多不该走的弯路,希望刚涉及到此注册表函数的人能越过此坑。
耗费时间3天。(非完整3天,一没有思路就扔下,之后明天再继续拾起来解决)
完结