![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает RegKey.KeyExists [D2005, XP]
dobriy-kot © (2008-05-14 12:17:00)Пытаюсь сделать проверку на существование ключа в реестре, чтобы если он уже создан просто его считать. Но условие не проходит, пошаговое выполнение программы показывает, что компилятор проскакивает условный оператор.
RegKey.OpenKey('Software\Test',true);
if RegKey.KeyExists('Software\Test') then
RegPass:= RegKey.ReadString('Crypto')
else
begin
RegKey:= TRegIniFile.Create('Software\Test');
RegKey.WriteString('Crypto',CryptoValue);
end;
Не работает также
if RegKey.KeyExists('Crypto') then
Подскажите, пожалуйста, что можно сделать?
Сергей М. (2008-05-14 15:25:00) [1]Пример:
[HKEY_CURRENT_USER\Software\Skype\Phone\UI\General]
" Language"="ru"
Выделенное жирным - полное имя ключа, включающее абсолютный путь к ключу от корня
Language - имя одного из параметров этого ключа
ru - значение параметра Language
Так вот Read/WriteString будет обращаться именно к значению параметра Language ключа HKEY_CURRENT_USER\Software\Skype\Phone\UI\General, а не к ключу HKEY_CURRENT_USER\Software\Skype\Phone\UI\General\Language.
Ущучиваешь разницу ?
Сергей М. (2008-05-14 15:17:00) [2]
> После этого я хочу выяснить, существует ли ключ Cryptoв
> этом разделе
И где в своем коде ты это делаешь ?
Read/WriteString работает не с ключем по имени Crypto, а с неким значением по имени Crypto, возможно существующим в открытом/созданном тобой ключе Software\Test !
Anatoly Podgoretsky (2008-05-14 14:50:00) [3]> dobriy-kot (14.05.2008 14:44:10) [10]
У ключей нет значений, ты всетаки или путаешь или не понимаешь, что такое ключ, а что такое параметр.
dobriy-kot (2008-05-14 14:44:00) [4]Сергей М.
Смотри. Суть такова: если не существует ключ Crypto, то программа должна запросить создание пароля (потому что он отсутствует). Если существует - то просто прочесть значение ключа Crypto из реестра.
Получается так: если раздел Test отсутствует, то OpenKey создает его, на что показывает параметр true. Если он есть, то просто открывается (Соответственно, наличие раздела нас не интересует - он в любом случае появится).
После этого я хочу выяснить, существует ли ключ Crypto в этом разделе. Его значение не существенно. Если ключ не существует, мы его создаем. Если существует - читаем его значение.
Как написано в хелпе о KeyExists - "Determines if a specified key exists". Насколько я понимаю, именно то, что нужно.
Сергей М. (2008-05-14 14:24:00) [5]
> Не работает также
> if RegKey.KeyExists('Crypto') then
Похоже, что ты путаешь ключ'Crypto' со значением'Crypto' некоего ключа
Сергей М. (2008-05-14 14:21:00) [6]
> мне надо, чтобы и проверка выполнялась
Проверка должна начинаться раньше, так как это описано в справке к OpenKey:
OpenKey returns true if the key is successfully opened or created
Гдеона у тебя, эта проверка ?
Какой резон что-то там пыжиться дальше по тексту, если ты сразу же не убедился в том, что ключ успешно создан или открыт в рез-те вызова OpenKey ?
dobriy-kot (2008-05-14 14:14:00) [7]
> т.е. вот это:
>
> > begin
> > RegKey:= TRegIniFile.Create('Software\Test');
> > RegKey.WriteString('Crypto',CryptoValue);
> > end;
>
> никогда не выполнится....
Как раз это и выполняется прекрасно. А мне надо, чтобы и проверка выполнялась. Это возможно?
Anatoly Podgoretsky (2008-05-14 13:17:00) [8]TRegIniFile никак не похож на TRegistry
{RASkov} (2008-05-14 13:00:00) [9]> [0] dobriy-kot © (14.05.08 12:17)
> Но условие не проходит, пошаговое выполнение программы показывает,
> что компилятор проскакивает условный оператор.
Потому как после выполнения первой строчки у тебя уже есть этот "Software\Test"
и соответственно следующяя проверка выполняется но возможно не найден "Crypto"....
Так как туда он в данном месте не пишеться.... т.е. вот это:
> begin
> RegKey:= TRegIniFile.Create('Software\Test');
> RegKey.WriteString('Crypto',CryptoValue);
> end;
никогда не выполнится....
dobriy-kot (2008-05-14 12:41:00) [10]
> И почему TRegIniFile - ты что для Windows 3.1 пишешь?
Переменная типа TRegistry.
var RegKey: TRegistry;
Anatoly Podgoretsky (2008-05-14 12:39:00) [11]И почему TRegIniFile - ты что для Windows 3.1 пишешь?
dobriy-kot (2008-05-14 12:39:00) [12]Да, знает. По умолчанию все пишется в HKEY_CURRENT_USER.
Anatoly Podgoretsky (2008-05-14 12:38:00) [13]'Software\Test' а это где, а система знает где это?
Читать до посинения, абсолютные и относительные пути.