我有一个方法试图在两个可能的位置从注册表中读取一个值。如果成功,应该返回它。到目前为止,它一直有效。
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
)。
答案 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
。因此该方法正确返回了值,但我将其与错误的常量进行了比较。
我不知道为什么它能奏效。