通过RegQueryValueEx和RegGetValue获取注册表值时的怪异行为
Weird behavior when getting registry value via RegQueryValueEx and RegGetValue
我在c++中使用上述函数时遇到了一些问题。两者的行为方式完全相同。以下是我看到的过程:
-
运行代码以获取注册表值。仔细检查它是否找到了10000,它应该有10000(10000是每个进程GDI对象的默认窗口限制),它确实找到了。
-
使用regedit将注册表更改为10000 以外的内容
-
再次运行代码,但这一次它再次找到10000,而它本应该找到新的值。
无论我尝试什么,它总是只找到最初的价值,而不是注册表的更新值。
我注意到/尝试过的事情:
-
它对我看到的每个值都这样做,而不仅仅是GDIProcessHandleQuota。(它并不总是返回10000,因为这是GDI值特有的,它只是总是返回任何给定值的预修改值)
-
即使我重新启动计算机并打开regedit来验证密钥,它也会这样做实际上在运行步骤3之前发生了更改。
-
下面代码中的所有结果值(results、results2、results3)都为0,表示ERROR_SUCCESS(lol),这意味着它们没有遇到任何问题。
最后,这里是我遇到问题的代码片段:
HKEY hKey;
//open the key for viewing in RegQueryValueEx, store opened handle in hkey
LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows",
0,
KEY_ALL_ACCESS,
&hKey);
DWORD dwReturn;
DWORD dwBufSize = sizeof(DWORD);
//after this line executes, dwReturn should have the DWORD data of the specified registry key/valuename
LONG result2 = RegQueryValueEx(hKey,
"GDIProcessHandleQuota",
0,
0,
reinterpret_cast<LPBYTE>(&dwReturn),
&dwBufSize);
DWORD value;
DWORD size = sizeof(DWORD);
//after this executes, value should contain the DWORD data of the specified registry key/valuename
LONG result3 = RegGetValue(hKey,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows",
"GDIProcessHandleQuota",
RRF_RT_ANY,
NULL,
&value,
&size
);
在64位计算机上运行32位应用程序时,您的问题很可能是由WOW64模拟器引起的。有关更多详细信息,请参阅MSDN文档:
注册表重定向器
受WOW64 影响的注册表项
注册表中的32位和64位应用程序数据
访问备用注册表视图
要在32位应用程序中打开64位密钥,当使用RegOpenKeyEx()
打开密钥时,需要包含KEY_WOW64_64KEY
标志,或使用RegGetValue()
打开密钥时需要包含RRF_SUBKEY_WOW6464KEY
标志。
您也使用过多的权限打开了密钥(这可能会在UAC下启动注册表虚拟化,但在本例中,您正在访问的特定密钥禁用了该权限,但您应该注意这一点)。KEY_ALL_ACCESS
仅适用于管理员用户。大多数用户没有对HKLM的写访问权限,只有只读访问权限,因此对于非管理员来说,使用KEY_ALL_ACCESS
打开密钥将失败。始终请求您实际需要的最低权限。在这种情况下,打开密钥进行KEY_QUERY_VALUE
访问。
您也在使用错误的参数值调用RegGetValue()
。
试试类似的东西:
HKEY hKey;
//open the key for viewing in RegQueryValueEx, store opened handle in hkey
LONG result = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows",
0,
KEY_QUERY_VALUE | KEY_WOW64_64KEY,
&hKey);
if (result != ERROR_SUCCESS)
{
...
}
else
{
DWORD value;
DWORD size = sizeof(DWORD);
//after this line executes, value should have the DWORD data of the specified registry key/valuename
result = RegQueryValueEx(
hKey,
"GDIProcessHandleQuota",
0,
0,
reinterpret_cast<LPBYTE>(&value),
&size);
if (result != ERROR_SUCCESS)
{
...
}
size = sizeof(DWORD);
//after this executes, value should contain the DWORD data of the specified registry key/valuename
result = RegGetValue(
hKey,
NULL,
"GDIProcessHandleQuota",
RRF_RT_REG_DWORD,
NULL,
&value,
&size);
if (result != ERROR_SUCCESS)
{
...
}
RegCloseKey(hKey);
}
或者:
DWORD value;
DWORD size = sizeof(DWORD);
//after this executes, value should contain the DWORD data of the specified registry key/valuename
LONG result = RegGetValue(
HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows",
"GDIProcessHandleQuota",
RRF_RT_REG_DWORD | RRF_SUBKEY_WOW6464KEY,
NULL,
&value,
&size);
if (result != ERROR_SUCCESS)
{
...
}
- RegQueryValueEx每次都返回不同的值
- 使用RegQueryValueEx将reg_sz作为输入并将其用作char数组
- 使用 WriteFile 将 RegQueryValueEx 值写入文件失败
- RegQueryValueEx 不返回值的数据
- 使用 RegQueryValueEx 从注册表中获取计算机名称
- 从RegQueryValueEx()DWORD返回无效数据
- RegQueryValueEx,需要一些帮助
- 视觉 如何在C++中正确进行 RegQueryValueEx 调用
- problems with RegQueryValueEx
- RegQueryValueEx返回另一个寄存器的值的奇怪行为
- RegQueryValueEx给出奇怪的数据
- RegQueryValueEx() api在XP上没有提供正确的设置值
- 通过RegQueryValueEx和RegGetValue获取注册表值时的怪异行为