• RegQueryValueEx正确使用方法


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

    HKEY hKey;
    WCHAR szLocation[MAX_PATH] = {''};
    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
    ", ret);
    
    if (ERROR_SUCCESS == ret)
    { 
    	ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, (LPBYTE)&szLocation, &dwSize);
    	wprintf(L"RegQueryValueEx returns %d, dwSize=%d
    ", 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] = {''};
    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
    ", ret);
    
    if (ERROR_SUCCESS == ret)
    { 
    	ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, NULL, &dwSize);
    	wprintf(L"RegQueryValueEx returns %d, dwSize=%d
    ", ret, dwSize);
    
    	ret = RegQueryValueEx(hKey, TEXT("install_location"), 0, &dwType, (LPBYTE)&szLocation, &dwSize);
    	wprintf(L"RegQueryValueEx returns %d, dwSize=%d
    ", ret, dwSize);
    	if (ERROR_SUCCESS == ret)
    	{
    		wprintf(L"Location: %s
    ", szLocation);
    	}
    	RegCloseKey(hKey);
    } 
    

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

    参考链接

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

  • 相关阅读:
    MYSQL 之 JDBC(十三):处理事务
    MYSQL 之 JDBC(十四):批量处理JDBC语句提高处理效率
    MYSQL 之 JDBC(十五):数据库连接池
    MYSQL 之 JDBC(十六): DBUtils
    MYSQL 之 JDBC(十七): 调用函数&存储过程
    Android初级教程理论知识(第八章网络编程二)
    android6.0SDK 删除HttpClient的相关类的解决方法
    iOS下WebRTC音视频通话(三)-音视频通话
    love~LBJ,奥布莱恩神杯3
    Android简易实战教程--第二话《两种进度条》
  • 原文地址:https://www.cnblogs.com/csuftzzk/p/RegQueryValueEx_Usage.html
Copyright © 2020-2023  润新知