Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.10.09;
Скачать: [xml.tar.bz2];

Вниз

Функция 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
1-1269069357
GA001
2010-03-20 10:15
2011.10.09
Сообщения форме


2-1308483468
ZimFFa
2011-06-19 15:37
2011.10.09
запросы


1-1267523155
Spot
2010-03-02 12:45
2011.10.09
Ка отразить по горизонтали изображение png


2-1308570515
Alex_C
2011-06-20 15:48
2011.10.09
Событие OnTimer


15-1308313863
RGV
2011-06-17 16:31
2011.10.09
Реализация подсказки типа DropDownList.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский