程序员

RegQueryValueEx () | 如何读取REG_DWO

2018-01-20  本文已影响0人  之乏

不多说,看下面代码。

#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天,一没有思路就扔下,之后明天再继续拾起来解决)

完结

上一篇 下一篇

猜你喜欢

热点阅读