Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.09;
Скачать: CL | DM;

Вниз

Функция TRegistry.OpenKey. Что делать если...?   Найти похожие ветки 

 
Германн ©   (2011-06-19 01:49) [0]

Если сия функция вернула False? Параметр CanCreate установлен в True. Работаю только в HKCR.
И нужно ли вообще что-то делать? Или достаточно указать в документации что-то о необходимых правах пользователя программы?
Win7.


 
Германн ©   (2011-06-19 02:28) [1]

То бишь я о том, что в хелпе Д6/Д2007 ничего не сказано о том, что делать, если сия функция вернула False.
Оборачивать её в Win32Check?


 
Германн ©   (2011-06-19 02:30) [2]

Или использовать GetLasError?


 
Loginov Dmitry ©   (2011-06-19 08:25) [3]


> Или достаточно указать в документации что-то о необходимых
> правах пользователя программы?


О каких необходимых правах пользователя может идти речь, если не удается создать/открыть ключ в пользовательском разделе реестра? При работе с данным разделом не должно быть вообще никаких сбоев. Ситуация разовая, или происходит постоянно? Если разовая, то похоже на сбой в Windows, который мог произойти по разным причинам, например:
- преждевременная выгрузка службы, отвечающей за работу с реестром;
- деструктивная работа вирусного ПО;
- зачастую еще более деструктивная работа антивирусного ПО;
- отказ железа;
- и др.


 
Loginov Dmitry ©   (2011-06-19 08:26) [4]


> Работаю только в HKCR.


Сорри, перепутал с HKCU (еще не проснулся :))))


 
Loginov Dmitry ©   (2011-06-19 08:33) [5]


> И нужно ли вообще что-то делать?


Конечно. Следует вывести пользователю окно с сообщением о том, что у него не достаточно прав для записи в реестр и что запуск ПО должен быть выполнен под администратором. Но данная ситуация не должна быть типичной для приложения, т.е. администратор запускает приложение, производит необходимые настройки, а вся дальнейшая работа должна выполняться в режиме ограниченного пользователя (конечно, если речь идет не о службах).


 
Юрий Зотов ©   (2011-06-19 09:27) [6]

Вообще-то, прежде, чем сообщать что-то пользователю, следовало бы выяснить причину ошибки - может, и не в правах вовсе дело?

Кстати, интересная вещь. В обработчике OnCreate главной формы пытаемся открыть несуществующий ключ реестра, запретив его создание:

procedure TForm1.FormCreate(Sender: TObject);
begin
 with TRegistry.Create do
 try
   RootKey := HKEY_CURRENT_USER;
   if Win32Check(OpenKey("aaa", False)) then
     CloseKey
 finally
   Free
 end
end;

Естественно, получаем ошибку - но как вы думаете, какую?

А вот какую:
System error. Code: 1447.
Окно не имеет полос прокрутки.


D7, XP.


 
Loginov Dmitry ©   (2011-06-19 09:31) [7]


> В обработчике OnCreate главной формы пытаемся открыть



> System error. Code: 1447.
> Окно не имеет полос прокрутки.


Юрий, а если попробовать в OnShow?
;)


 
Юрий Зотов ©   (2011-06-19 09:56) [8]

> Loginov Dmitry ©   (19.06.11 09:31) [7]

Тут и пробовать не надо - и без того ясно, что сообщение связано с отсутствием окна. Но почему?

Вот верхушка стека вызовов в момент появления сообщения об ошибке:
RaiseLastOSError
Win32Check(False)
TForm1.FormCreate($957E38)

и уже на первой же строке RaiseLastOSError:
LastError := GetLastError;
получаем LastError = 1447

Ну и при чем тут какие-то окна?


 
Юрий Зотов ©   (2011-06-19 10:08) [9]

Такое может быть, если OpenKey затирает ошибку OS - тогда, конечно, GetLastError вернет не то, что нужно. Хорошо, идем отладчиком по OpenKey. При заданных параметрах вызова там исполняются следующие операторы:

S := Key;
Relative := IsRelative(S);
if not Relative then Delete(S, 1, 1);
TempKey := 0;
if not CanCreate or (S = "") then
begin
 Result := RegOpenKeyEx(GetBaseKey(Relative), PChar(S), 0,
   FAccess, TempKey) = ERROR_SUCCESS;
end

после чего следует выход с результатом False. Ошибка OS возникает при вызове RegOpenKeyEx и не затирается. Так в чем же дело?


 
sniknik ©   (2011-06-19 12:03) [10]

> Так в чем же дело?
х.з. конечно, но у меня отличается -

в onCreate дает -
System Error.  Code: 6.
Неверный дескриптор

в любом другом (по кнопке, в оншоу, до крейте в проекте, до инициализации в пректе) -
A call to an OS function failed

> связано с отсутствием окна.
в проекте, окон тоже нет...
т.е. тут связано наверно с началом, но не завершением создания окна. (LastError в этот момент неизменен?)


 
sniknik ©   (2011-06-19 12:04) [11]

> D7, XP.
тоже самое.


 
Игорь Шевченко ©   (2011-06-19 13:46) [12]


> Кстати, интересная вещь.


Ничего интересного, глупо вызывать GetLastError после TRegistry.OpenKey

RegOpenKeyEx:
If the function succeeds, the return value is ERROR_SUCCESS.

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

http://msdn.microsoft.com/en-us/library/ms724897(v=vs.85).aspx


 
Loginov Dmitry ©   (2011-06-19 14:30) [13]


> Тут и пробовать не надо - и без того ясно, что сообщение
> связано с отсутствием окна. Но почему?


Ситуация аналогична истории с классом TIniFile. Ошибка чтения или записи ini-файла может возникнуть по разным причинам, в том числе при попытке параллельной записи в ini-файл другим процессом. Точно также мы не узнаем точную причины ошибки записи / чтения, т.к. ошибка при чтении игнорируется, а при записи заменяется на текст "Unable to write to FileName". И точно также GetLastError в данной ситуации (в случае ошибки чтения ini-файла) ничем не поможет.


 
Юрий Зотов ©   (2011-06-19 22:00) [14]

> Игорь Шевченко ©   (19.06.11 13:46) [12]

Ну да, как выяснилось RegOpenKeyEx не вызывает SetLastError и выдает результат сам. Но какой именно результат она выдает - это тоже фокус.

procedure TForm1.FormCreate(Sender: TObject);
var
 TempKey: HKey;
 OpenRes, SysRes: Cardinal;
begin
 TempKey := 0;
 OpenRes := RegOpenKeyEx(HKEY_CURRENT_USER, "aaa", 0, KEY_ALL_ACCESS, TempKey);
 SysRes := GetLastError;
 ShowMessage(Format("OpenRes = %d: %s"#13#10#13#10"SysRes = %d: %s",
   [OpenRes, SysErrorMessage(OpenRes), SysRes, SysErrorMessage(SysRes)]))
end;

Результат:

OpenRes = 2: Не удается найти указанный файл
SysRes = 1447: Окно не имеет полос прокрутки

Вот так - оказывается, не найден файл, а вовсе не ветка реестра.


 
Игорь Шевченко ©   (2011-06-19 22:17) [15]


> Вот так - оказывается, не найден файл, а вовсе не ветка
> реестра.


ERROR_KEY_NOT_FOUND нету.


 
Юрий Зотов ©   (2011-06-19 22:59) [16]

> Игорь Шевченко ©   (19.06.11 22:17) [15]

32-битные значения уже кончились?
:o)


 
Германн ©   (2011-06-19 23:42) [17]


>  Loginov Dmitry ©   (19.06.11 08:26) [4]
>
>
> > Работаю только в HKCR.
>
>
> Сорри, перепутал с HKCU (еще не проснулся :))))
>

Сорри, это я очепятался.

Всем спасибо!


 
Германн ©   (2011-06-20 04:52) [18]

Самое смешное, что когда я задавал сей вопрос проблем у меня не было. Я только хотел "подстелить соломку" на всякий случай.
Проблемы возникли только сегодня после полуночи. И только не более 5% этих проблем было связано с реестром в целом и с OpenKey в частности. Их я решил, но возник другой вопрос.



Страницы: 1 вся ветка

Текущий архив: 2011.10.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
2-1308433781
Германн
2011-06-19 01:49
2011.10.09
Функция TRegistry.OpenKey. Что делать если...?


2-1308498013
Gu
2011-06-19 19:40
2011.10.09
TOpenDialog - zip как файлы


2-1308354496
Германн
2011-06-18 03:48
2011.10.09
Как рассчитать "необходимый и достаточный" размер кнопки TButton


15-1308383062
Юрий Зотов
2011-06-18 11:44
2011.10.09
Требуется квалифицированный Web-мастер ...


15-1307107653
Tim
2011-06-03 17:27
2011.10.09
Помогите стать мастером Delphi