Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает 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' а это где, а система знает где это?
Читать до посинения, абсолютные и относительные пути.


Наверх

Титульная страница Поиск, карта сайта Написать письмо