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

Вниз

Backup ветки реестра...   Найти похожие ветки 

 
kull   (2002-09-25 13:21) [0]

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

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

Я пробую так:

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;


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


 
LordOfSilence   (2002-09-25 13:30) [1]

Не на 100%, но все-таки:

Попробуйте разнести эти операции во времени.
То есть сначала Create, SaveKey, DeleteKey, Free.
Потом Create, LoadKey, Free.
Опять-таки попробуйте сделать эти операции не
одну за другой, а рассадите на разные события.
Например Button1Click, Button2Click.


 
kull   (2002-09-25 13:36) [2]


> LordOfSilence © (25.09.02 13:30)

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


 
kull   (2002-09-25 13:45) [3]

Блин народ...
Я в hepl-e обнаружил, что LoadKey не поддерживается на win98, которая у меня стоит. Главное что SaveKey работает а LoadKey нет.

Что делать?


 
Андрей Прокофьев   (2002-09-25 13:54) [4]

В каком help-e?


 
Внук   (2002-09-25 13:57) [5]

Очень интересно, до сегодняшнего дня поддерживалось


 
LordOfSilence   (2002-09-25 14:01) [6]

Ужасно умная мысль: если у Вас файл располагается
на FAT-томе, расширение должно отсутствовать.
Опять же из хелпа:

Before an application calls LoadKey, the RootKey property must be set to HKEY_USERS, HKEY_LOCAL_MACHINE, or to a key returned by a previous call to RegistryConnect.


 
kull   (2002-09-25 14:08) [7]


> Внук © (25.09.02 13:57)

А загляните-ка в "Win32 Programmer"s reference", справка по RegLoadKey. Там есть кнопочка сверху - "QuickInfo". Там написано что где поддерживается...


 
Внук   (2002-09-25 14:10) [8]

Именно там я и смотрел :)


 
Андрей Прокофьев   (2002-09-25 14:14) [9]

>>А загляните-ка в "Win32 Programmer"s reference", справка по >>RegLoadKey. Там есть кнопочка сверху - "QuickInfo". Там >>написано что где поддерживается...
SaveKey и LoadKey - одинаково


 
kull   (2002-09-25 14:16) [10]


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

Может я что-то не понимаю, но там написано:

Windows NT Yes
Win95 Yes
Win32s No


 
Внук   (2002-09-25 14:18) [11]

Win32s - урезанная подсистема поддержки 32-разрядного кода, к Win98 отношения не имеет. Нас должно в данном случае интересовать Win95-Yes. Еще есть MSDN.


 
Внук   (2002-09-25 14:21) [12]

Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000/XP. Also supported by Microsoft Layer for Unicode.
Header: Declared in Winreg.h; include Windows.h.
Library: Use Advapi32.lib.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regloadkey.asp


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


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

Ну ну хорошо пусть будет так, но вопрос в том почену не работает?
Ведь вызов SaveKey и LoadKey одинаковый, а LoadKey не работает, а также RestoreKey.


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

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

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


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

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


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

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


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

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


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

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


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

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


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


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

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


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

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


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

Насчет 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 - уже поздно. А в том случае не было бы этой дискуссии.


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

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


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


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

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

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


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

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


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

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


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

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 тоже...


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


> Anatoly Podgoretsky © (25.09.02 16:08)

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

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


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

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


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

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


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

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


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

На всякий случай, в 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


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

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



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

Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
3-20895
скорпион
2002-09-14 16:50
2002.10.07
ошибка работы по сети


1-21113
ych_boriss
2002-09-25 16:07
2002.10.07
HintWindow


4-21319
Dimik
2002-08-21 00:43
2002.10.07
Можно ли изменить отображаемую папку в конкретном окне Эксплорера


1-20994
Осирис
2002-09-26 12:28
2002.10.07
Наследование форм


14-21192
VladD2
2002-09-10 20:44
2002.10.07
Темы для статей по Дельфи!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский