RegQueryValueEx получает странное значение - PullRequest
1 голос
/ 17 июля 2010

Я пытаюсь получить некоторые значения из реестра. Вот полный путь: [HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Themes] "ThemeChangesMousePointers" = 0x00000001 (1)

А вот и мой код:

HKEY hKey;
DWORD dwDisp = REG_DWORD;
DWORD dwType;
DWORD dwSize = sizeof(DWORD);
DWORD dwValue = 0;
DWORD dwReturn;
char buffer[255] = {0};
//char* buffer;
//DWORD buffer = 0;
DWORD dwBufSize = sizeof(buffer);

if( RegOpenKey(HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes")
    ,&hKey) == ERROR_SUCCESS)
{
    dwType = REG_DWORD;
    if( RegQueryValueEx(hKey,_T("ThemeChangesMousePointers"),0, &dwType, (LPBYTE) buffer, &dwBufSize) == ERROR_SUCCESS)
    {
        printf("Key value is: %d \n", buffer);
        printf("GetLastError reports %d \n", GetLastError());
    }
    else
    {
        printf("Cannot query for key value \n");
    }
}

Я попытался отладить, и похоже, что моя выходная переменная буфера дает мне странный вывод:

Значение ключа: 2554292 Ошибка 0

Каждый раз, когда я снова запускаю код, я получаю разные значения. Как я могу получить реальное значение, а не другое?

РЕДАКТИРОВАТЬ: Сообщение выше было отредактировано, чтобы задать другой вопрос.

Кроме того, если этого кода недостаточно, я могу добавить больше.

1 Ответ

5 голосов
/ 17 июля 2010

RegQueryValueEx не вызывает SetLastError, он напрямую возвращает код ошибки.

Возвращаемое значение

Если функция завершается успешно, возвращаемое значениеERROR_SUCCESS.
В случае сбоя функции возвращаемое значение является кодом системной ошибки.
Если буфер lpData слишком мал для приема данных, функция возвращает ERROR_MORE_DATA.
ЕслиЗначение реестра lpValueName не существует, функция возвращает ERROR_FILE_NOT_FOUND.

РЕДАКТИРОВАТЬ В ОТВЕТЕ НА КОММЕНТАРИЙ:

Сначала я ответил на ваш конкретный вопрос, немного о том, что вы отправили код, все еще есть несколько проблем:

  • Вы вызываете устаревший метод RegOpenKey, а не RegOpenKeyEx.
  • Вы пытаетесь прочитать целое число, но читаете его как строку типа char *.Это наиболее вероятная причина проблем, с которыми вы сталкиваетесь ... функция возвращает целое число, но вы печатаете ее в виде строки.
  • Условное значение IF обратное
HKEY hKey;
DWORD dwDisp = REG_DWORD;
DWORD dwSize = sizeof(DWORD);
DWORD dwValue = 0;
DWORD dwReturn;
DWORD dwBufSize = sizeof(DWORD);

if( RegOpenKeyExW(HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes"
    ,0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
    DWORD error = RegQueryValueExW(hKey,L"ThemeChangesMousePointers",0,0, reinterpret_cast<LPBYTE>(&dwReturn), &dwBufSize);
    if(error == ERROR_SUCCESS)
    {
        printf("Key value is: %d \n", dwReturn);
    }
    else
    {
        printf("Cannot query for key value; Error is: %d\n", error);
    }
}
RegCloseKey(hKey);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...