通过RegQueryValueEx和RegGetValue

时间:2016-07-21 01:33:03

标签: c++ winapi registry

我在使用上述功能的c ++中遇到了一些问题。两者的行为方式完全相同。这是我看到的过程:

  1. 运行代码以获取注册表值。仔细检查它是否找到10000,它应该有(10000是每个进程的GDI对象的默认窗口限制),它确实如此。

  2. 使用regedit将注册表更改为10000以外的其他内容

  3. 再次运行代码,但这次它再次找到10000,它应该找到新值。

  4. 无论我尝试什么,它总是只找到原始值而不是 注册表的更新值。

    我注意到/尝试过的事情:

    1. 它为我所看到的每一个值做到了这一点,而不仅仅是GDIProcessHandleQuota。 (它并不总是返回10000,因为它特定于GDI值,它只是总是返回任何给定值的预修改值)

    2. 即使重新启动计算机并打开regedit以验证密钥,它也会这样做 在运行第3步之前实际发生了变化。

    3. 下面代码中的所有结果值(结果,结果2,结果3)都是0,表示ERROR_SUCCESS(lol),这意味着它们没有遇到任何问题。

    4. 最后,这里是我遇到问题的代码片段:

      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
          );
      

1 个答案:

答案 0 :(得分:1)

在64位计算机上运行32位应用程序时,您的问题很可能是由WOW64模拟器引起的。有关更多详细信息,请参阅MSDN文档:

Registry Redirector

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);
}