RegQueryValueEx正确使用方法
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RegQueryValueEx正确使用方法相关的知识,希望对你有一定的参考价值。
项目中需要读取注册表中的HKEY_CLASSES_ROOT主键下一个子键的值,看了看MSDN的说明,有RegOpenKeyEx和RegQueryValueEx两个函数可以用。也没仔细阅读函数说明,就写了一段简单的代码来测试:
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正确使用方法的主要内容,如果未能解决你的问题,请参考以下文章
使用RegQueryValueEx作为可能为REG_DWORD或REG_SZ的注册表值
使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%
使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组
RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关