Считать значение «Дата установки ОС» из реестра с помощью RegQueryValueExA () api не удалось - PullRequest
0 голосов
/ 10 октября 2018

Я хочу прочитать Windows Install Date значение из реестра с использованием Windows API, как показано ниже:

HKEY hKey = { 0 };
LONG lResult = ERROR_SUCCESS;

// Open a registry key
lResult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
                        "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
                        0, KEY_READ, &hKey);

// If registry key opened
if (lResult == ERROR_SUCCESS)
{
    // Get OS install date/time
    DWORD dwInstallDate = 0;
    dwBufferSize = sizeof(DWORD);
    if (RegQueryValueExA(hKey, "InstallDate", 0, NULL, (LPBYTE)&dwInstallDate, &dwBufferSize) == ERROR_SUCCESS)
    {
        printf("OS Install Date is : %lu", dwInstallDate);
    }
    else
    {
        printf("The specific key not found!");
    }

    // Finally we should close the key when we finished with it
    RegCloseKey(hKey);
}

Но вывод всегда 0, в то время как "InstallDate" значение равно 1520291827:

OS Installe Date is : 0

Кроме того, я использую форматы "%ld" и "d", но у него тот же вывод ...
Значение "InstallDate"в реестре содержал тип REG_DWORD.
Кстати, когда я создаю новое значение REG_DWORD, мой код не может его прочитать:

Например, я создаю значение ниже:адрес как "test" с 123 данными:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

Но dwInstallDate будет 0 вместо 123:

RegQueryValueExA(hKey, "test", 0,
                 NULL, (LPBYTE)&dwInstallDate,
                 &dwBufferSize);

Любое предложение?Я запутался в этом действии ...

1 Ответ

0 голосов
/ 10 октября 2018

Согласно Microsoft:

  • KEY_WOW64_32KEY (0x0200):

    Указывает, что приложение в 64-битной Windows должноработать с 32-битным представлением реестра.Этот флаг игнорируется 32-битной Windows.Для получения дополнительной информации см. Доступ к альтернативному представлению реестра .Этот флаг должен быть объединен с использованием оператора OR с другими флагами в этой таблице, которые запрашивают или получают доступ к значениям реестра.Windows 2000: этот флаг не поддерживается.

  • KEY_WOW64_64KEY (0x0100):

    Указывает, что приложение в 64-битной Windows должно работать в 64-битном представлении реестра.Этот флаг игнорируется 32-битной Windows.Для получения дополнительной информации см. Доступ к альтернативному представлению реестра .Этот флаг должен быть объединен с использованием оператора OR с другими флагами в этой таблице, которые запрашивают или получают доступ к значениям реестра.Windows 2000: этот флаг не поддерживается.

Я использовал KEY_WOW64_64KEY | KEY_READ в любом случае x86 и x64:

// Open a registry key
lResult = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
                        "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
                        0, KEY_WOW64_64KEY | KEY_READ, &hKey);

Это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...