Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-49567
Eagle Owl
2004-01-02 15:20
2004.01.16
Code Insight


14-49730
Chuha
2003-12-24 18:26
2004.01.16
Казахстановцы


1-49537
Magician
2004-01-02 15:44
2004.01.16
Где ошибка(drawicon)!


9-49384
mrk
2003-06-03 15:17
2004.01.16
прозрачная текстура md3 и Glscene


1-49609
The X
2004-01-05 09:36
2004.01.16
Глобальное использование задатчиков вроде DecimalSeparator





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