Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.16;
Скачать: CL | DM;

Вниз

Не могу сохранить ветку реестра в файл.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
1-49554
GooG-NTS
2004-01-06 04:42
2004.01.16
BitMap ресурсы!


14-49745
JibSkeart
2003-12-24 15:11
2004.01.16
Приколна :))


3-49391
Крутыш
2003-12-20 15:10
2004.01.16
Action какие может принимать значения


7-49787
MakNik
2003-11-03 12:38
2004.01.16
Панель задач


3-49392
Floppy
2003-12-19 16:53
2004.01.16
Сортировка в лукар поле