RegQueryValueEx () всегда возвращает только 4 байта строки - PullRequest
0 голосов
/ 30 января 2010

Что я делаю не так в этот раз? Следующий код всегда возвращает только 4 байта вместо всей строки:

HKEY hkey;
DWORD dwType, dwSize;

char keybuffer[512];

if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("software\\company name\\game name"), 0, KEY_READ, &hkey) == ERROR_SUCCESS){
    dwType = REG_SZ;
    dwSize = sizeof(keybuffer);
    RegQueryValueEx(hkey, TEXT("setting"), NULL, &dwType, (PBYTE)&keybuffer, &dwSize);
    RegCloseKey(hkey);
}

Даже если я изменю dwSize на что-либо, он все равно вернет 4 байта.

Редактировать: Видимо, не было ошибки в приведенном выше коде, но в другом месте -_-

Ответы [ 4 ]

3 голосов
/ 30 января 2010

Я помню имя ключа реестра из предыдущего вопроса . У вас была проблема с созданием стоимости. В этом потоке значение было создано как DWORD, 4 байта. Это слишком много совпадений. Запустите Regedit.exe и перейдите к созданному вами ключу и проверьте тип значения. Если это все еще DWORD, вы никогда не получите более 4 байтов назад, даже если вы запросите строку.

Исправьте код, который создает значение, убедитесь, что вы создаете REG_SZ, а не REG_DWORD. Используйте Regedit.exe, чтобы удалить старое значение перед запуском кода.

1 голос
/ 30 января 2010

(PBYTE) и ключевой буфер - неправильно. должен быть (PBYTE) ключевой буфер.

1 голос
/ 30 января 2010

Может быть, не ответ, но ...

  1. вам не нужно присваивать dwType = REG_SZ, потому что dwType является выходным параметром.
  2. вы можете использовать NULL для замены (PBYTE) и буфера ключей, чтобы увидеть, сколько места ему нужно
  3. Вы уверены, что HKEY_CURRENT_USER верен или LOCAL_MACHINE? И есть ли "установка" в REG_SZ для CURRENT_USER и LOCAL_MACHINE, если они у вас есть?
  4. проверьте возвращаемое значение RegQueryValueEx.
0 голосов
/ 30 января 2010

Я вижу еще две потенциальные ловушки здесь. Во-первых, как упомянул Фрэнсис, вы должны проверить возвращаемое значение. 4 байта на самом деле соответствуют ожидаемым строковым символам? Они могут быть чем угодно. С документация :

Если буфер, указанный в параметре lpData, недостаточно велик для хранения данных, функция возвращает ERROR_MORE_DATA и сохраняет требуемый размер буфера в переменной, на которую указывает lpcbData. В этом случае содержимое буфера lpData не определено.

Вторая потенциальная ошибка заключается в том, что вы используете массив char с функцией, которая принимает параметры TCHAR. Если вы компилируете для Unicode, компилятор с радостью позволит вам записать широкую строку в ваш узкий строковый буфер, благодаря приведению к PBYTE. Безопаснее использовать TCHAR последовательно или не использовать его вообще (т.е. звонить RegQueryValueExA или RegQueryValueExW).

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