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

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

Backup ветки реестра... [D6]


Страницы:   1 2

kull ©   (2002-09-25 13:21:00) 

Привет народ!

Кто подскажет как мне сохранить ключ реестра (вместе со всем его содержимым) в файл, с возможностью ее дальнейшего восстановления из этого файла?

Я пробую так:

procedure TForm1.Button1Click(Sender: TObject);
var
R: TRegistry;
begin
R := TRegistry.Create;
R.RootKey := HKEY_CURRENT_USER;
R.SaveKey("SOFTWARE\mykey","c:\key");
R.DeleteKey("SOFTWARE\mykey");
{вот до этого места все замечательно работает файл сохраняется,
ветка удаляется, а дальше восстановить эту ветку не
получается }
R.LoadKey("SOFTWARE\mykey","c:\key");
R.Free;
end;


Кто скажет в чем здесь проблемма? Или может можно другим способом?


Внук   (2002-09-26 09:08:00) [1]

Отвечаю, как и обещал.
Покопался вчера дома, нарыл попутно кучу совершенно бесполезной информации, хоть статью пиши :))
В общем, для Win9x дело обстоит так - ключи можно загружать только с помощью RegLoadKey и только в корни HKLM и HKU, то есть можно, например, создать ключ HKLM\MyCoolKey, содержащий информацию из ранее созданного с помощью RegSaveKey файла, но HKLM\SomeExistingKey\MyCoolKey уже нельзя. То есть, только непосредственных потомков этих ключей, а также ключей HKU и HKLM в реестре на другой машине.
Для восстановления произвольной ветки, скорее всего, придется писать собственную (рекурсивную?) функцию и придумывать собственный формат файла backup-а.
Хорошо хоть дома реестр не рухнул после моих экспериментов :)


Anatoly Podgoretsky   (2002-09-25 16:45:00) [2]

На всякий случай, в HKEY_USERS может не быть конкретного пользователя, тогда надо .DEFAULT выбирать.

Но эти гады в хелпе по TRegistry пишут следующее

Note: The file specified by FileName parameter must be created with the SaveKey function, or by directly calling the Windows 95/NT RegSaveKey API function. Under the FAT file system FileName cannot have an extension.

Короче это надо практикой проверить.
Насчет SaveKey там это не требуется, но лучше все проверять практикой, хелпы могут быть неверны, при этом хелпы надо читать перекрестно, Win и Delphi


kull   (2002-09-25 16:32:00) [3]

Ладно спасибо, за помощь....


Внук   (2002-09-25 16:25:00) [4]

Кстати, в HKEY_USERS нет ключа SOFTWARE, нужно сначала конкретного пользователя выбрать


Внук   (2002-09-25 16:23:00) [5]

ОК, у меня дома WinME есть, постараюсь посмотреть :)


kull   (2002-09-25 16:15:00) [6]


> Anatoly Podgoretsky © (25.09.02 16:08)

RestoreKey под win98 не поддерживается.

А насчет того, что ключ должен быть открыт: зачем тогда в функции есть параметр, где указывается этот ключ. К тому же SaveKey работает и без открытого ключа.


kull   (2002-09-25 16:12:00) [7]

procedure TForm1.Button1Click(Sender: TObject);
var
R: TRegistry;
begin
R := TRegistry.Create;
R.RootKey := HKEY_USERS;
R.SaveKey("SOFTWARE\mykey","c:\key");
R.DeleteKey("SOFTWARE\mykey");
R.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
R: TRegistry;
begin
R := TRegistry.Create;
R.RootKey := HKEY_USERS;
R.LoadKey("SOFTWARE\mykey","c:\key");
R.Free;
end;


- это не работает. С HKEY_LOCAL_MACHINE тоже...


Anatoly Podgoretsky   (2002-09-25 16:08:00) [8]

Ну и надо учесть, что ключ должен быть открыт, чего в примере не наблюдается, кроме того рекомендуется использовать не LoadKey, a RestoreKey


Внук   (2002-09-25 15:57:00) [9]

>>kull © (25.09.02 15:49)
Согласен, но раз возвращает 0, значит что-то не так, потому что при вызове напрямую этого случится никак не должно (делал такое раньше, сейчас проверять лень, поэтому спорить не буду).
Теперь по сути: ветка HKEY_CURRENT_USER - ссылка на HKEY_USERS\"Some User". Аналогично, HKEY_CLASSES_ROOT = HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES, поэтому проблем быть не должно :)


kull   (2002-09-25 15:49:00) [10]


> Внук © (25.09.02 15:04)

GetLastError надо вызывать не обязательно сразу, и она возврашает код ошибки последнего API вызова из потока. Так у меня она как раз сразу и вызывается. Если заглянуть в код метода LoadKey, то последней строкой там стоит вызов:
Result := RegLoadKey(RootKey, PChar(S), PChar(FileName)) = ERROR_SUCCESS;

А насчет HKEY_USES, то надо чтоб работало с лубыми ветками. А если конкретно, то мне нужно работать с "HKEY_CLASSES_ROOT\CLSID".


Anatoly Podgoretsky   (2002-09-25 15:04:00) [11]

Так ты попробовал писать в раздел HKEY_USERS


Внук   (2002-09-25 15:04:00) [12]

Насчет RegRestoreKey я и не спорю. Насчет "как сделать" - я уже ответил, ведь сами Help цитировали: The HKEY_CLASSES_ROOT and HKEY_CURRENT_USER handle values cannot be specified for this parameter, because they represent subsets of the HKEY_LOCAL_MACHINE and HKEY_USERS handle values, respectively. Вот и пишите в HKEY_USERS.
А насчет GetLastError - ее вызывать надо сразупосле вызова критическойфункции. После завершения LoadKey - уже поздно. А в том случае не было бы этой дискуссии.


kull   (2002-09-25 14:58:00) [13]

И причем здесь GetLastError?
Когда вопрос в другом, как сделать?


kull   (2002-09-25 14:57:00) [14]


> Внук © (25.09.02 14:45)

А зачем вызывать напрямую API, когда в хелпе ясно написано, что не RegRestoreKey поддерживается, а RegLoadKey не может писать в HKEY_CURRENT_USER. А GetLastError я вызывал после TRegistry.LoadKey (error code = 0).


Anatoly Podgoretsky   (2002-09-25 14:46:00) [15]

Ну так первая это алиас, точнее мапировано, а востановление подразумевает реальный раздел, так что не вижу проблемы.


Внук   (2002-09-25 14:45:00) [16]

А если браться всерьез, я до сих пор не пойму, почему уважаемый автор вопроса до сих пор не попробовал вызвать напрямую API и посмотреть хотя бы GetLastError.


Внук   (2002-09-25 14:43:00) [17]

>>Anatoly Podgoretsky © (25.09.02 14:40)
Ага, однако, написано, что в HKEY_USERS можно :)


Anatoly Podgoretsky   (2002-09-25 14:40:00) [18]

Так HKEY_CURRENT_USER и HKEY_USERS это одно и тоже, второе меня смущает, что у тебя относительный путь вместо абсолютного


Внук   (2002-09-25 14:36:00) [19]

Может быть, писать в HKEY_USERS\Тот-самый-который-сейчас-текущий


kull   (2002-09-25 14:32:00) [20]

Я все понял, судя по справке по RegLoadKey:
"The HKEY_CLASSES_ROOT and HKEY_CURRENT_USER handle values cannot be specified for this parameter..." он и не должен работать, а RegRestoreKey - не поддерживается на win98.

Что же делать?


Страницы:   1 2

Наверх

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