RegQueryValueEx () | 如何读取REG_DWOED类型 值 | win32 RegQueryValueEx () | RegQueryValueEx () 乱码 | RegQueryValueEx () 读取注册表

不多说,看下面代码。

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


完结

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容