RegQueryValueEx正确使用方法

项目中需要读取注册表中的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

时间: 2024-08-06 23:20:18

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

SQL Server附加数据库出现错误5123的正确解决方法

SQL Server附加数据库出现错误5123的正确解决方法 因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008.起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server

AspectJ学习笔记2-Eclipse中AspectJ插件AJDT的正确安装方法

接着之前一篇日志.这个事情也挺无语的,简单记录一下. 在这里:http://www.eclipse.org/ajdt/ 可以下载最新的Eclipse Plugin,下载解压之后,一般来说,直接把解压后文件夹下的features和plugins放到Eclipse的文件夹下就行了.不过我这样做以后,启动Eclipse,发现没什么作用.才参考网上有人介绍的第二种方法,也就是Help--Install New Software--Add--Local这种方式选择刚才的解压文件夹,但是这样操作以后会报像下

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

存在问题 FTP搭建完成后,仅本机可以访问,其他机器无法访问. 解决方案 这时,将C:\Windows\System32\svchost.exe添加到例外即可正常访问,如下图所示.将20及21端口添加至高级防火墙中可能也能正常访问.但这并不是正确的方法,正确的方法是:无需单独配置防火墙,直接重新启动计算机即可. 参考资料 http://www.cnblogs.com/dennlu/archive/2012/06/04/2534925.html http://zhcxl.blog.51cto.co

回收站的正确使用方法

  一. 用法 以前都是直接忽视回收站的,删东西的时候都会按住Shift.但是人在网上飘,哪能不挨刀,难免有手抖的时候.但是后来还是嫌清空回收站麻烦,基本还是直接删除的.   后来我听说某公司准备了七个垃圾桶(放废弃文件的),每天收一个.所以不要的文件还会在垃圾桶里呆一个星期才会被清理走.这样的话不但减少了文件找不回的可能,扔那一个星期再不要的话说明也确实该扔了.同时也让员工在扔文件时更果断--反正一个星期后才会被清走.   所以我觉得咱电脑的回收站也该这么用: 删文件时删进垃圾桶 删的时候果断

Javascript 正确使用方法 二

好的,废话不多说,接着上篇来. 变量(variables) 始终使用 var 关键字来定义变量,如果不这样将会导致 变量全局化,造成污染. //bad superPower = new SuperPower(); //good var superPower = new SuperPower(); 使用 一个 var关键字来定义多个变量...并且每个变量一行.. // bad var items = getItems(); var goSportsTeam = true; var dragonba

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

Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一般网上修改方法就是直接修改文件: /proc/sys/fs/inotify/max_user_watches 或者修改方法: sysctl -w fs.inotify.max_user_watches="99999999" 但是这些修改后,Linux系统重启inotify配置max_use

Flexbox 布局的正确使用方法

Flexbox 布局的正确使用方法 在项目中,我们还会大量使用到flexbox的新旧属性,但大多数人一般只会写新属性,旧属性交由autoprefixer处理,但其实完成同样功能的新旧属性表现形式却不尽相同.还有部分人只使用"万能"的flex:number属性为伸缩项目分配空间,但有些特殊情景却无法满足,此文为此梳理了flexbox的新旧属性区别和分配空间的原理,为大家用flexbox布局的项目通通渠. Flexbox兼容性 PC端的兼容性 移动端的兼容性 如上图,为了兼容IE10-11

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

最近要使用thinkphp3.2版本的cli模式,手动执的话没有问题,比如php /www/index.php home/article/get 这样没有问题,但是一般用cli模式都是定时任务比较多,这个时候写到定时任务的时候,比如 0 * * * * * php /www/index.php home/article/get 这样就会出现引入ThinkPHP.php失败的问题,这个问题算是比较容易解决的,但是后来还有其他各种报错,经过查看相关核心代码,终于找到无需修改代码,就可以轻易使用cli

Javascript 正确使用方法

今天在github 上面找到了一个关于如何正确使用javascript 来进行我们的程序开发.我就恬不知耻的来了个原创啊..坑爹啊.拿来和大家分享一下吧. A mostly reasonable approach to Javascript. Types //类型 Objects //对象 Arrays //数组 Strings //字符串 Functions //函数 Properties //属性 Variables //变量 Hoisting //变量提升 Conditional Expr