RegGetValue返回类型REG_NONE

时间:2019-01-15 14:55:19

标签: visual-c++

我有一个方法试图在两个可能的位置从注册表中读取一个值。如果成功,应该返回它。到目前为止,它一直有效。

wstring Tool::GetCustomizedFromRegistry(LPCWSTR szName)
{
    wstring szProdNameLong = L"";
    HKEY hKey;
    LONG res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Test\\Case", 0, KEY_READ, &hKey);
    if (res == ERROR_SUCCESS)
    {
        DWORD size = 1024;
        WCHAR value[1024];
        DWORD type;
        long error = RegGetValue(hKey, NULL, szName, RRF_RT_REG_SZ, &type, &value, &size);

        if (error == ERROR_SUCCESS && type == RRF_RT_REG_SZ && size > 0)
            return wstring(value);
    }

    res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Test", 0, KEY_READ, &hKey);
    if (res == ERROR_SUCCESS)
    {
        DWORD size = 1024;
        WCHAR value[1024];
        long error = RegGetValue(hKey, NULL, szName, RRF_RT_REG_SZ, NULL, &value, &size);
        if (error == ERROR_SUCCESS)
            return wstring(value);
    }

    return L"";
}

由于将我们的开发机器之一更新到Windows 10,因此不再起作用。问题是我们检查了RegGetValue的类型返回值。那是REG_NONE而不是REG_SZ(在注册表中实际上是REG_SZ)。

2 个答案:

答案 0 :(得分:0)

我在Windows 10上尝试了您的代码,并且工作正常。请注意,如果您在x64机器上运行x86应用程序,则密钥将位于“ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node”,仅当您的应用程序为X64时才能访问“ Software \ Test \ Case”中的密钥。

答案 1 :(得分:0)

问题是我使用了错误的常数。我使用的RRF_RT_REG_SZ的值为2,而RRF_RT_REG_NONE的值为1。类型变量中将返回1。

我应该使用实际上为1的常量REG_SZ。因此该方法正确返回了值,但我将其与错误的常量进行了比较。

我不知道为什么它能奏效。