Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 261

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Я тут пытаюсь сохранить ключ реестра в файл(приложение), но сохранение не происходит, точнее создается пустой файл и функция SaveKey возращает false. В чем ошибка?

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. reg: TRegistry;
  4. begin
  5. reg:=TRegistry.Create;
  6. reg.RootKey:=HKEY_CURRENT_USER;
  7. reg.SaveKey('Environment','C:K.key');
  8. reg.Free;
  9. end;


Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 10 января 2008, 13:19
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Трофимов Евгений!
А ошибка в том, что Вы не открываете конкретный раздел/ключ реестра. Вы указале только ROOT. А надо еще потом открыть ветку реестра командой OpenKey и закрывать в конце CloseKey. Пример:

{ создаём объект TRegistry }
Registry := TRegistry.Create; 
{ устанавливаем корневой ключ; напрмер hkey_local_machine или hkey_current_user } 
Registry.RootKey := KEY_CURRENT_USER;
{ открываем и создаём ключ }
Registry.OpenKey('Environment', true); 
{ сохраняем в файл ветку }
Registry.SaveKey('Environment','C:\K.key');
{ закрываем и освобождаем ключ }
Registry.CloseKey; 
Registry.Free;

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 10 января 2008, 13:41

Ответ #2. Отвечает эксперт: min@y™

А теперь внимание, правильный ответ... Буммммммм!
--------------
Мне вопрос понравился, хотя я никогда не занимался программным быкапом реестра. Инфы по Registry.SaveKey() действительно маловато, но я решил таки добить эту проблему. Помню, давно это было, была задача перезагруза/выключения компа. Под Win98 ExitWindowsEx() отрабатывала на ура. Ага, пока не поставили тогда ещё новомодную Win2k. В ней, как и во всех NT-системах, для начала требуется установить кой-какие правильные привилегии. Также и в нашем случае.
Я откопал:
а) свой старинный исходник с перезагрузкой;
б) раздел SDK под названием "RegSaveKey() Requires SeBackupPrivilege".
Затем я загрузил Delphi, применил а) и б) и вот что у меня получилось:

procedure TForm1.Button1Click(Sender: TObject);
const
  FileName = 'K.key';
var
  handle: THandle;
  reg: TRegistry;
  res: Boolean;
  luid: TLargeInteger;
  priv: TOKEN_PRIVILEGES;
  n: DWORD;
begin
  // Получение привилегий под NT-платформы:
  if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, handle)
    then if LookupPrivilegeValue(nil, 'SeBackupPrivilege', luid)
          then begin
                 priv.PrivilegeCount := 1;
                 priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                 priv.Privileges[0].Luid := luid;
                 AdjustTokenPrivileges(handle, false, priv, 0, nil, n);
               end;
 
  // Файл, в который сохраняешь, должен НЕ существовать - удаляешь
  if (FileExists(FileName))
    then DeleteFile(FileName);
 
  // Сохранение в файл
  // reg.OpenKey() и reg.CloseKey() не нужны, т.к. метод TRegistry.SaveKey()
  // сам открывает и закрывает ключ реестра
  reg:= TRegistry.Create;
  reg.RootKey:= HKEY_CURRENT_USER;
  if reg.SaveKey('\Environment', 'K.key')
    then ShowMessage('Success!')
    else ShowMessage('OBLOM :(');
 
  reg.Free;
end;

З.Ы. Ложка дёгтя: REG-файлы получаются не в формате Regedit (текст), а в формате Regedt32 (двоичные).

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 10 января 2008, 15:12
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 11 января 2008, 08:24; участников в обсуждении: 2.
Евгений Eklmn

Евгений Eklmn (статус: Посетитель), 10 января 2008, 16:58 [#1]:

Мутатень то какая! Лучше самому написать функцию сохранения и восстановления, только использовать текстовые файлы. Да, и весят файлы полученные функцией SaveKey не мало(экспортированный файл в RegEdit 4 КБ, а в моей проги аж 3 Мб). Но всеравно всем спасибо.
Генерация случайных чисел - слишком важный вопрос, чтобы оставлять его на волю случая. (Роберт Ковзю, Окриджская лаборатория)
min@y™

min@y™ (статус: Доктор наук), 11 января 2008, 08:24 [#2]:

Где ты там намерил 3 МБ? У меня получилось 8 кБ.

Цитата:


Лучше самому написать функцию сохранения и восстановления, только использовать текстовые файлы.


Ладно, чего уж велосипеды изобретать, всё уже сделано за нас. Нашёл я один пакетик в котором, кроме всего прочего, есть:

Цитата:


TExRegistry, derived from TRegistry provides additional registry handling capabilities, including support for Multi String values, and importing and exporting regedit compatible .REG files


Прочитать об этом пакете можно здесь. Скачать пакет можно отсюда, 345.53 Кб, ссылка живая, проверил.

З.Ы. С тебя пиво! :)))
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 сентября 2017, 09:44
Выполнено за 0.05 сек.
Рейтинг@Mail.ru