1

RegQueryValueEx() 函数有问题
当我使用它时,它会用 0 填充 *lpData

LONG WINAPI RegQueryValueEx(
  _In_         HKEY hKey,
  _In_opt_     LPCTSTR lpValueName,
  _Reserved_   LPDWORD lpReserved,
  _Out_opt_    LPDWORD lpType,
  _Out_opt_    LPBYTE lpData,
  _Inout_opt_  LPDWORD lpcbData
);

这是不起作用的代码

#include <windows.h>
#include <stdio.h>

int             main()
{
    HKEY        hKey = NULL;
    DWORD       data = 42;
    DWORD       type = REG_DWORD;
    DWORD       size = sizeof(DWORD);
    LONG        result;

    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKey);
    if(result == ERROR_SUCCESS)
    {
        result = RegQueryValueEx(hKey, "InstallDate", NULL, &type, (LPBYTE)&data, &size);
        RegCloseKey(hKey);
        if (result == ERROR_SUCCESS)
            printf("The value is : %d\n", data);
    }
    return (0);
}

输出:

值为:0

我使用 Visual Studio 2012 并且正在运行 Win7


编辑:更正的行

result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ | KEY_WOW64_64KEY, &hKey);

感谢@David Heffernan

4

1 回答 1

3

您正在 64 位 Windows 上运行 32 位进程。这意味着您受制于注册表重定向器,因此正在读取该值实际上为 0 的注册表的 32 位视图。注册表重定向器将您的密钥映射到:

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion

在 regedit 中查看,看看你的值是 0。

您需要在 64 位进程中运行您的代码,或者从注册表的 64 位视图中读取。要执行后者,KEY_WOW64_64KEY请在您打开密钥时传递的标志中包括。可以在 MSDN 上找到更多详细信息,描述如何访问备用注册表项

于 2013-11-13T22:43:19.810 回答