我有一个方法,它尝试在两个可能的位置从注册表中读取值。如果成功,则应该返回它。到目前为止,它是有效的。
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"";
}
自从将我们的一台开发机器更新到Windows10之后,这就不再起作用了。问题是我们检查RegGetValue
的类型返回值。这是REG_NONE
而不是REG_SZ
(在注册表中,它实际上是REG_SZ
)。
发布于 2019-01-17 16:19:04
问题是我用错了常量。我使用的RRF_RT_REG_SZ
的值为2,RRF_RT_REG_NONE
的值为1。将在类型变量中返回1。
我应该使用常量REG_SZ
,它实际上是1,所以这个方法返回的值是正确的,但是我把它和错误的常量进行了比较。
我不知道为什么它会起作用。
发布于 2019-01-16 00:02:18
我在windows10上测试了你的代码,它运行得很好。请注意,如果您在X64机器上运行x86应用程序,密钥将位于"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node",只有当您的应用程序为x64时,才能访问“软件\测试\用例”中的密钥。
https://stackoverflow.com/questions/54201373
复制相似问题