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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值