Фантастика: работа с реестром
Код:
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.
У меня мало опыта, поэтому я не могу въехать, в чем дело. Очередной глюк?
Переменные инициализировать не забываем никогда: DWORD KeySize = 5000;
Сама функция должна занести в нее значение длины строки! Тем более, причем здесь KeySize=5000?
Если ты имеешь в виду соответствие с KeyValue[5000], то это не имеет значения. Я могу передать просто указатель *KeyValue, и все прекрасно работает.
Смысл KeySize в том, чтобы я знал, сколько байт функция вернула в KeyValue. МНЕ ее инициализировать НЕ НАДО!
Так что вопрос все еще открыт!
Цитата:
Originally posted by lifer
Если ты имеешь в виду соответствие с KeyValue[5000], то это не имеет значения.
Если ты имеешь в виду соответствие с 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.
Хорошо, но тогда почему, когда KeySize локальна, и я ее не инициализирую, все прекрасно работает, а если глобальна, то нет?
Блин, и вообще с точки зрения логики: KeySize передается по ссылке, а не по значению!То есть полагается, что функции нужно знать адрес, куда занести длину строки. И зачем инициализировать, если после возврата функции значение KeySize все-равно меняется?
Цитата:
Originally posted by lifer
Блин, и вообще с точки зрения логики: KeySize передается по ссылке, а не по значению!То есть полагается, что функции нужно знать адрес, куда занести длину строки. И зачем инициализировать, если после возврата функции значение KeySize все-равно меняется?
Блин, и вообще с точки зрения логики: KeySize передается по ссылке, а не по значению!То есть полагается, что функции нужно знать адрес, куда занести длину строки. И зачем инициализировать, если после возврата функции значение KeySize все-равно меняется?
Это обычный Windows механизм. На входе - максимальное значение буффера (буффер-то выделяешь ты, а не функция), после выполнения - реальное количество записанной информации. Читать надо внимательней - нпаисано же перед описанием: [in, out]
Это обычный Windows механизм.
Ну ладно, против механизма не попрешь, а на [in,out] я просто внимания не обращал(как видно зря). Хорошо, я согласен. Не пойму только одного.
Когда KeySize локальна и не инициализирована, все работает, когда глобальна, то нет. Здесь-то в чем дело?
Цитата:
Originally posted by lifer
[QUOTE]Originally posted by HarryAxe
Это обычный Windows механизм.
Ну ладно, против механизма не попрешь, а на [in,out] я просто внимания не обращал(как видно зря). Хорошо, я согласен. Не пойму только одного.
Когда KeySize локальна и не инициализирована, все работает, когда глобальна, то нет. Здесь-то в чем дело?
[QUOTE]Originally posted by HarryAxe
Это обычный Windows механизм.
Ну ладно, против механизма не попрешь, а на [in,out] я просто внимания не обращал(как видно зря). Хорошо, я согласен. Не пойму только одного.
Когда KeySize локальна и не инициализирована, все работает, когда глобальна, то нет. Здесь-то в чем дело?
Не более, чем случайность. На другой машине это может быть по-другому (или, скажем, в компиляции под Release). Неинициализированная переменная могла содержать ноль или какое-то другое недопустимое функцией значениие.
Ну что ж,понятно...Спасибо за разъяснение, однако,блин, я все равно не согласен с таким механизмом. Это сродни тому, что когда нужно ПРОСТО ПОСМОТРЕТЬ возвращаемое некоторой функцией значение, необходимо вызвать FormatMessage, использовать туеву хучу структур и т.д. То есть наверняка можно было бы сделать все попроще...