项目中需要读取注册表中的HKEY_CLASSES_ROOT主键下一个子键的值,看了看MSDN的说明,有RegOpenKeyExRegQueryValueEx两个函数可以用。也没仔细阅读函数说明,就写了一段简单的代码来测试:

HKEY hKey;
WCHAR szLocation[MAX_PATH] = {'\0'};
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_SZ;
LPCTSTR studioPath = TEXT("insta360\\studio");
LONG ret;
ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, studioPath, 0, KEY_READ, &hKey);
wprintf(L"RegOpenKeyEx returns %d\n", ret); if (ERROR_SUCCESS == ret)
{
ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, (LPBYTE)&szLocation, &dwSize);
wprintf(L"RegQueryValueEx returns %d, dwSize=%d\n", ret, dwSize);
if (ERROR_SUCCESS == ret)
{
wprintf(L"Location: %s", szLocation);
}
RegCloseKey(hKey);
}

  一运行才发现啥也没读出来,而RegQueryValueEx()竟然返回的是234(ERROR_MORE_DATA),顿时一脸懵逼。

网上一搜才知道,关键的关键在于这个函数的最后一个参数。其类型标注为[in][out]。也就是说,这个参数既作为函数的输入,也作为函数的输出。函数在读取注册表时会将实际需要的空间大小存在这个参数中。用户根据这个大小再来分配需要的内存空间。所以程序在正式读取之前,可以调用这个函数试探一下大小:

HKEY hKey;
WCHAR szLocation[MAX_PATH] = {'\0'};
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_SZ;
LPCTSTR studioPath = TEXT("insta360\\studio");
LONG ret;
ret = RegOpenKeyEx(HKEY_CLASSES_ROOT, studioPath, 0, KEY_READ, &hKey);
wprintf(L"RegOpenKeyEx returns %d\n", ret); if (ERROR_SUCCESS == ret)
{
ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, NULL, &dwSize);
wprintf(L"RegQueryValueEx returns %d, dwSize=%d\n", ret, dwSize); ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, (LPBYTE)&szLocation, &dwSize);
wprintf(L"RegQueryValueEx returns %d, dwSize=%d\n", ret, dwSize);
if (ERROR_SUCCESS == ret)
{
wprintf(L"Location: %s\n", szLocation);
}
RegCloseKey(hKey);
}

  注意试探的时候,这个函数的倒数第二个参数应该传递NULL。但实际上也可以不试探。而是将最后一个参数的输入值设置大一点,这样就不会返回234错误代码了。

参考链接

https://www.experts-exchange.com/questions/23897919/RegQueryValueEx-causes-Error-234.html

RegQueryValueEx正确使用方法的更多相关文章

  1. thinkphp3.2 cli模式的正确使用方法

    最近要使用thinkphp3.2版本的cli模式,手动执的话没有问题,比如php /www/index.php home/article/get 这样没有问题,但是一般用cli模式都是定时任务比较多, ...

  2. Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法

    Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一 ...

  3. MyEclipse10的正确破解方法

    无法转载,故给出原文链接,以供需要者. MyEclipse10的正确破解方法

  4. [转]MySQL忘记密码的正确解决方法

    http://database.51cto.com/art/201005/201986.htm 以下的文章主要介绍的是MySQL忘记密码的正确解决方法,在实际操作中如果你忘记MySQL密码是一件很头痛 ...

  5. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  6. .Net core 下的ConfigurationManager类正确引用方法

    大家在项目中经常会用到需要引用配置文件的情况,这也是我偶然间遇到的问题,菜鸟一枚,如有需纠正多谢指点. 正题 在不先引用using的情况下直接写 ConfigurationManager.AppSet ...

  7. SpringBoot 中 @RequestBody的正确使用方法

    SpringBoot 中 @RequestBody的正确使用方法 最近在接收一个要离职同事的工作,接手的项目是用SpringBoot搭建的,其中看到了这样的写法: @RequestMapping(&q ...

  8. CentOS正确关机方法(转)

    CentOS正确关机方法 1关机前准备 1.1观察系统使用状态 ·         谁在线:who ·         联网状态:netstat -a ·         后台执行的程序:ps -au ...

  9. windows server 2008 R2 的 FTP 防火墙的正确配置方法

    存在问题 FTP搭建完成后,仅本机可以访问,其他机器无法访问. 解决方案 这时,将C:\Windows\System32\svchost.exe添加到例外即可正常访问,如下图所示.将20及21端口添加 ...

随机推荐

  1. RSA密钥生成与使用

    RSA密钥生成与使用 openssl生成工具链接:http://pan.baidu.com/s/1c0v3UxE 密码:uv48 1. 打开openssl密钥生成软件打开 openssl 文件夹下的  ...

  2. .NET 4.0 版本号

    .NET 4.5.1, .NET 4.5 和 .NET 4.0 均基于 .NET 4.0 CLR,而 .NET 4.5 对 CLR进行了升级和Bug修复. .NET 4.0 - 4.0.30319.1 ...

  3. Lesson 10 Not for jazz

    Text We have an old musical instrument. It is called a clavichord. It was made in Germany in 1681. O ...

  4. Kruskal 最小生成树算法

    对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...

  5. log4j2.xml实用例子

    一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0 ...

  6. 小学徒成长系列—StringBuilder & StringBuffer关键源码解析

    在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...

  7. EF6 Power Tools的妙用和问题

    环境:vs2013+EF:6.1.3.0+Power Tools:Beta 4 power tools:是一个反向工程,在已有数据库的情况下,可以利用它生成Code Frist模式的代码. 问题: 它 ...

  8. rem单位和em单位的使用

    今天弄了一点响应式的东西,本以为很快就可以弄好,结果还是绕晕了头,所以还是写下来方便下次看吧! 一开始我打算用百分比%来做响应式布局,后来算的很懵圈,就果断放弃了,哈哈是不是很明智. 接下来就是rem ...

  9. 数据结构与算法JavaScript (五) 串(经典KMP算法)

    KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...

  10. 一起学微软Power BI系列-官方文档-入门指南(5)探索数据奥秘

    我们几篇系列文章中,我们介绍了官方入门文档与获取数据等基本知识.今天继续给大家另外一个重点,探索数据奥秘.有了数据源,有了模型,下一步就是如何解析数据了.解析数据的过程需要很多综合技能,不仅仅是需要掌 ...