Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
ВнизНе могу сохранить ветку реестра в файл. Найти похожие ветки
← →
lipskiy (2004-01-02 18:38) [0]При сохранении только создается файл, пустой, нулевого размера.
Пробовал на разных ветках, результат одинаковый.
Что неправильно?:
Rg:= TRegistry.Create;
Rg.RootKey:= HKEY_CURRENT_USER;
if SaveDialog1.Execute then Rg.SaveKey("Software\WinRAR\Profiles", SaveDialog1.FileName);
Rg.Free;
← →
хз (2004-01-02 18:43) [1]открыть ключ надо сначала, имхо...
← →
AlexFed (2004-01-02 18:48) [2]гдето видел вот что:
Экспортировать можно с помощью самого RegEdit"а средствами командной строки:
%WINDIR%\regedit /e C:\YourApp.reg HKEY_CURRENT_USER\Software\YourName\YourApp
Соответственно, импорт:
%WINDIR%\regedit -s C:\YourApp.reg
Для выполненя этих строк можно использовать WinExec.
← →
default (2004-01-02 18:53) [3]хелп читать надо...(TRegisty.SaveKey + F1)
It must be the name of a new file that does not already exist.
← →
Ihor Osov'yak (2004-01-02 20:04) [4]2 [1] хз © (02.01.04 18:43)
TRegistry.SaveKey открывает соотв. ветку реестри
2 [2] AlexFed (02.01.04 18:48)
Импорт в текстовый файл и сохранение есть немного разные вещи
2 [3] default © (02.01.04 18:53)
Вероятнее всего, что причина неудачи не в том.
2 lipskiy © (02.01.04 18:38)
Желательно указать тип операционной системы. Для NT ряда нужно запросить соотв. привилегии (см AdjustTokenPrivileges). Для w9x должно работать, если не сделана ошибка, упоминаемая в [3]
← →
default (2004-01-02 20:23) [5]Ihor Osov"yak © (02.01.04 20:04) [4]
если бы дело было в привилегиях, то файл с нулевой длиной не создавался
← →
Ihor Osov'yak (2004-01-02 20:37) [6]2 [5] default © (02.01.04 20:23)
мое имхо подсказывает, что в NT при отсутствии привилегий на бакуп как раз и создается файл нулевой длинны. Здесь уточнение. Проверять мне сейчас лень, но с полугодичной давности воспоминаний (делал тогда соотв. проект) такое воспоминание осталось. Точно могу сказать, что без запроса привелегий в NT SaveKey работать не будет.
← →
default (2004-01-02 20:46) [7]Ihor Osov"yak © (02.01.04 20:37) [6]
просто я думаю, что без привилегий ключ не удастся открыть, поэтому дело до сохранения не дойдёт, может я и ошибаюсь, но если выбраь файл уже существующий файл нулевой длины точно создаётся
← →
lipskiy (2004-01-02 23:44) [8]
> хз © (02.01.04 18:43) [1]
Пробовал, не помогает.
> AlexFed (02.01.04 18:48) [2]
Это извращение. Только на крайняк, если уж совсем никак не выйдет.
> default © (02.01.04 18:53) [3]
Я разве говорил, что хелп не читал? Из моего примера разве явствует, что я сохраняю в уже созданный файл?
И кстати, поясни, а в чем тут проблема может быть вообще? Че это вдруг нельзя в существующий файл сохранять, что оно не может переписать что-ли?
> Ihor Osov"yak © (02.01.04 20:04) [4]
Пишу под XP, а работать должно под всеми NT5.
Насчет привелегий - спасибо, попробую проверить.
← →
lipskiy (2004-01-03 00:12) [9]Че-то ни фига я не понял, как привелегии запросить?
Может подскажете примерчик?
← →
default (2004-01-03 00:52) [10]lipskiy © (02.01.04 23:44) [8]
"Че это вдруг нельзя в существующий файл сохранять, что оно не может переписать что-ли?"
угу + файл нулевой длины создаётся
"Че-то ни фига я не понял, как привелегии запросить?"
посмотри сначала какая ошибка - ShowMessage(SysErrorMessage(GetLastError))
потом смотри хелп по RegSaveKey там есть про привилегии
← →
Ihor Osov'yak (2004-01-03 00:55) [11]
function SetPrivilege(Privilege: PChar;
EnablePrivilege: Boolean;
out PreviousState: Boolean): DWORD;
var
Token: THandle;
NewState: TTokenPrivileges;
Luid: TLargeInteger;
PrevState: TTokenPrivileges;
Return: DWORD;
begin
PreviousState := True;
if ((GetVersion() and $80000000) <> 0) then
begin
// Win9x
Result := ERROR_SUCCESS;
exit;
end;
// NT4, W2K, XP
if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
begin
Result := GetLastError();
exit;
end;
try
if not LookupPrivilegeValue(nil, Privilege, Luid) then
begin
Result := GetLastError();
exit;
end;
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := Luid;
if EnablePrivilege then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;
if not AdjustTokenPrivileges(Token, False, NewState,
SizeOf(TTokenPrivileges), PrevState, Return) then
Result := GetLastError()
else
begin
Result := ERROR_SUCCESS;
PreviousState :=
(PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
end;
finally
CloseHandle(Token);
end;
end;
а здесь собственно сохранение ветки (правда, не через TRegistry, напрямую через соотв. апишный вызов, но это не принципиально):
function RegSaveKeyToFile(Key: HKEY; const SubKey, FileName: string): DWORD;
const
SE_BACKUP_NAME = "SeBackupPrivilege";
var
PreviousState: Boolean;
KeyHandle: HKEY;
begin
if ((GetVersion() and $80000000) <> 0) then
begin
KeyHandle := 0;
Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
if (Result = ERROR_SUCCESS) then
try
if FileExists(FileName) then
DeleteFile(FileName);
RegFlushKey(Key);
Result := RegSaveKey(KeyHandle, PChar(FileName), nil);
finally
RegCloseKey(KeyHandle);
end;
exit;
end;
Result := SetPrivilege(SE_BACKUP_NAME, True, PreviousState);
if (Result <> ERROR_SUCCESS) then
exit;
try
KeyHandle := 0;
Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
if (Result = ERROR_SUCCESS) then
try
if FileExists(FileName) then
DeleteFile(FileName);
RegFlushKey(Key);
Result := RegSaveKey(KeyHandle, PChar(FileName), nil);
finally
RegCloseKey(KeyHandle);
end;
finally
if (not PreviousState) then
SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState);
end;
end;
← →
lipskiy (2004-01-03 17:16) [12]Спасибо за код. Проверил. Работает вроде, файл создался.
Не сочтите за наглость - а как теперь этот файл загрузить обратно в реестр?
У меня задача простая - импорт и экспорт настроек программы.
И еще, я вообще-то предполагал, что получу текстовый файл, как при экспорте ключей из regedit"а, а получил бинарный. На самом деле мне это не особо принципиально, но все же интересно, сложно ли и как экспортировать в текстовый файл и потом его импортировать в реестр? (Вариант ручного считывания/записи ветки по ключам я допускаю, но может есть попроще?)
← →
Anatoly Podgoretsky (2004-01-03 17:25) [13]Ну если не хочешь делать сам, то [2]
← →
lipskiy (2004-01-04 16:21) [14]
> Ну если не хочешь делать сам, то [2]
Сделал. Работает. Хоть это и не прикольно, но результат ожидаемый.
← →
Ihor Osov'yak (2004-01-04 16:35) [15]Ну, если работает, то оставь, как есть.
А RegSaveKey, действительно, работает с бинарными.
Обратно - или RegReplaceKey, RegRestoreKey (NT only), etс, спрашивай MSDN..
Но также та же история с привилегиями. На этот раз
const
SE_RESTORE_NAME = "SeRestorePrivilege";
Зы. А в общем, если устраивает импорт-експорт через текстовые файлы - то оставь как есть. Более наглядно, имхо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c