我在使用上述功能的c ++中遇到了一些问题。两者的行为方式完全相同。这是我看到的过程:
运行代码以获取注册表值。仔细检查它是否找到10000,它应该有(10000是每个进程的GDI对象的默认窗口限制),它确实如此。
使用regedit将注册表更改为10000以外的其他内容
再次运行代码,但这次它再次找到10000,它应该找到新值。
无论我尝试什么,它总是只找到原始值而不是 注册表的更新值。
我注意到/尝试过的事情:
它为我所看到的每一个值做到了这一点,而不仅仅是GDIProcessHandleQuota。 (它并不总是返回10000,因为它特定于GDI值,它只是总是返回任何给定值的预修改值)
即使重新启动计算机并打开regedit以验证密钥,它也会这样做 在运行第3步之前实际发生了变化。
下面代码中的所有结果值(结果,结果2,结果3)都是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
);
答案 0 :(得分:1)
在64位计算机上运行32位应用程序时,您的问题很可能是由WOW64模拟器引起的。有关更多详细信息,请参阅MSDN文档:
Registry Keys Affected by WOW64
32-bit and 64-bit Application Data in the Registry
Accessing an Alternate Registry View
要在32位应用中打开64位密钥,在使用KEY_WOW64_64KEY
打开密钥时需要包含RegOpenKeyEx()
标记,在使用{{打开密钥时需要包含RRF_SUBKEY_WOW6464KEY
标记1}}。
您还打开了具有太多权限的密钥(可以在UAC下启用Registry Virtualization,但是在此示例中您正在访问的特定密钥上禁用了该权限,但您应该知道它)。 RegGetValue()
仅适用于管理员用户。大多数用户没有HKLM的写入权限,只有只读访问权限,因此对于非管理员而言,使用KEY_ALL_ACCESS
打开密钥将失败。始终请求您实际需要的最低权限。在这种情况下,请打开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);
}