Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Фантастика: работа с реестром

9.8K
08 апреля 2006 года
lifer
27 / / 30.03.2006
Задача тривиальна - нужно открыть ключ, считать значение и закрыть ключ.
Код:
main()
{
DWORD KeySize;
HKEY KeyHandle;
BYTE KeyValue[5000];
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\SystemMonitoring\\LogFolderPath",NULL,KEY_ALL_ACCESS,&KeyHandle);
RegQueryValueEx(KeyHandle,"LogFolderPath",NULL,NULL,KeyValue,&KeySize);
RegCloseKey(KeyHandle);
printf("%s",KeyValue);
}
Все данные в значении ключа корректны-там записана текстовая строка REG_SZ (путь к папке).
Этот пример прекрасно работает, НО если сделать переменную KeySize глобальной, то в нее занесется верное значение длины текстовой строки, а вот KeyValue заполнится левой фигней.
Если KeySize локальна, RegQueryValueEx вернет "Операция успешно завершена", если глобальна - "Имееются дополнительный данные"
Посмотрел в отладчике - там при глобальном KeySize вообще не меняется KeyValue.
У меня мало опыта, поэтому я не могу въехать, в чем дело. Очередной глюк?
534
10 апреля 2006 года
HarryAxe
448 / / 19.01.2006
Переменные инициализировать не забываем никогда: DWORD KeySize = 5000;
9.8K
12 апреля 2006 года
lifer
27 / / 30.03.2006
В смысле инициализировать??? Зачем МНЕ ее инициализировать???
Сама функция должна занести в нее значение длины строки! Тем более, причем здесь KeySize=5000?
Если ты имеешь в виду соответствие с KeyValue[5000], то это не имеет значения. Я могу передать просто указатель *KeyValue, и все прекрасно работает.
Смысл KeySize в том, чтобы я знал, сколько байт функция вернула в KeyValue. МНЕ ее инициализировать НЕ НАДО!
Так что вопрос все еще открыт!
9.5K
12 апреля 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by lifer
Если ты имеешь в виду соответствие с KeyValue[5000], то это не имеет значения.



Ещё как имеет. Читаем MSDN:

Цитата:

LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);

lpcbData
[in, out] [COLOR=red]Pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes.[/COLOR] When the function returns, this variable contains the size of the data copied to lpData.

9.8K
13 апреля 2006 года
lifer
27 / / 30.03.2006
Хорошо, но тогда почему, когда KeySize локальна, и я ее не инициализирую, все прекрасно работает, а если глобальна, то нет?
9.8K
13 апреля 2006 года
lifer
27 / / 30.03.2006
Блин, и вообще с точки зрения логики: KeySize передается по ссылке, а не по значению!То есть полагается, что функции нужно знать адрес, куда занести длину строки. И зачем инициализировать, если после возврата функции значение KeySize все-равно меняется?
534
13 апреля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by lifer
Блин, и вообще с точки зрения логики: KeySize передается по ссылке, а не по значению!То есть полагается, что функции нужно знать адрес, куда занести длину строки. И зачем инициализировать, если после возврата функции значение KeySize все-равно меняется?

Это обычный Windows механизм. На входе - максимальное значение буффера (буффер-то выделяешь ты, а не функция), после выполнения - реальное количество записанной информации. Читать надо внимательней - нпаисано же перед описанием: [in, out]

9.8K
13 апреля 2006 года
lifer
27 / / 30.03.2006
[QUOTE]Originally posted by HarryAxe
Это обычный Windows механизм.

Ну ладно, против механизма не попрешь, а на [in,out] я просто внимания не обращал(как видно зря). Хорошо, я согласен. Не пойму только одного.
Когда KeySize локальна и не инициализирована, все работает, когда глобальна, то нет. Здесь-то в чем дело?
534
13 апреля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by lifer
[QUOTE]Originally posted by HarryAxe
Это обычный Windows механизм.

Ну ладно, против механизма не попрешь, а на [in,out] я просто внимания не обращал(как видно зря). Хорошо, я согласен. Не пойму только одного.
Когда KeySize локальна и не инициализирована, все работает, когда глобальна, то нет. Здесь-то в чем дело?

Не более, чем случайность. На другой машине это может быть по-другому (или, скажем, в компиляции под Release). Неинициализированная переменная могла содержать ноль или какое-то другое недопустимое функцией значениие.

9.8K
14 апреля 2006 года
lifer
27 / / 30.03.2006
Ну что ж,понятно...Спасибо за разъяснение, однако,блин, я все равно не согласен с таким механизмом. Это сродни тому, что когда нужно ПРОСТО ПОСМОТРЕТЬ возвращаемое некоторой функцией значение, необходимо вызвать FormatMessage, использовать туеву хучу структур и т.д. То есть наверняка можно было бы сделать все попроще...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог