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




Вниз

Помогите с TRegistry.SaveKey 


Barmutik   (2002-03-25 18:42) [0]

Пытаюсь сохранить кусок своего реестра в файл для последующего использования. На все мои попытки вызвать эту функцию вываливается только результат False и создаётся файл нулевого размера.

Подскажите что делать.. Может я чего забыл ?



Anatoly Podgoretsky   (2002-03-25 20:17) [1]

Наверно что то забыл.



Barmutik   (2002-03-26 10:22) [2]

:) Хооший комментарий !

Приведу кусок кода, может поможет:

var
MyRegistry: TRegistry;
begin
MyRegistry := TRegistry.Create;
try
MyRegistry.RootKey := HKEY_CURRENT_USER;
if not MyRegistry.SaveKey"Software\XXXXX\XXXX",
"C:\1.reg") then
begin
MessageDlg("Can"t save a registry to file", mtError,
[mbOK], 0);
end;
finally
MyRegistry.Free;
end;

И что бы я не делал сохранение никогда не проходит. Создаётся файл нулевого размера. Указанный ключ точно существует. Читал в хелпе что необходимо под FAT сохранять только в несуществующий(новый) файл и использовал файл без расширения. Ничего не помогает.

Подскажите что делать.. Только плиз реальный комментарий...



Внук   (2002-03-26 12:29) [3]

Создание пустого файла наталкивает на мысль, что недостаточно прав на выполнение операции. И действительно, немного исправив приведенный здесь код его эквивалентом (см. исходники):

var MyRegistry: TRegistry;
SaveError:integer;
begin
MyRegistry:=TRegistry.Create;
MyRegistry.Access:=KEY_ALL_ACCESS;
SaveError:=RegSaveKey(HKEY_LOCAL_MACHINE,"Test",nil);
ShowMessage(SysErrorMessage(SaveError));
MyRegistry.Free;
end;

получим в результате сообщение: клиент не обладает требуемыми правами :-)



Barmutik   (2002-03-26 18:15) [4]

Ну так и результат каков ? Ты не дал ответа на вопрос !

А насчёт KEY_ALL_ACCESS так в хелпе по SaveKey написано что он открывает указанный для записи ключ именно с такими правами.

Люди помогите ! Я по-прежнему в поиске ответа !



y-soft   (2002-03-26 18:47) [5]

Есть 2 варианта:

1. Получить необходимые привилегии
2. Использовать ключики командной строки Regedit.exe



Внук   (2002-03-26 18:58) [6]

>>Barmutik ©
Не дал, верно :) Я готовые куски кода редко даю, это мой метод отсева халявщиков. Вы правы насчет KEY_ALL_ACCESS, он здесь не обязателен, поскольку устанавливается в конструкторе, это моя привычка явного контроля за всеми мелочами.
Но... повторяю - смотрите исходники, а они для TRegistry на удивление прозрачны. Переписав Ваш код на API, получим то, что на самом деле делает TRegistry:

var Err:integer;
Hndl:HKEY;
begin
Err:=RegOpenKeyEx(HKEY_CURRENT_USER,PChar("Что-нибудь"),0,KEY_ALL_ACCESS,Hndl);
ShowMessage(SysErrorMessage(Err));
Err:=RegSaveKey(Hndl,"Test",nil);
ShowMessage(SysErrorMessage(Err));
...
end;
Здесь видно, что операция открытия ключа проходит успешно, а на операции экспорта выдается сообщение - недостаточно прав. Причем, я уверен, под Windows95 Ваш первоначальный код будет работать - попробуйте.
Далее - смотрим описание функции RegSaveKey и видим: The calling process must have the SE_BACKUP_NAME privilege. Это справедливо только для линии WinNT. Дальше попробуйте сами побродить по Help"у.



Barmutik   (2002-03-26 19:11) [7]

То Внук:

Прочитав Ваш первоначальный ответ я залез в хелп и прочитал про
RegSaveKey. Я прочитал про SE_BACKUP_NAME. Также просмотрел ссылку про привилегиям.

Не поленился и просмотрел код TRegistry.SaveKey.. Да там всё до безобразия понятно. Этот метод вызывают API-шную функцию.

Ещё вчера я не поленился и запустил это кусочек под Win95 и там проблем не возникло, но не если Вы можете заметить то мой вопрос относится имеено к Win2000.

Насчёт метода отсева халявщиков: возможно это конечно и классно,
но если подойти по-другому я же прошу Вас писать за меня то что мне нужно а дать конкретный ответ к коим Ваш совет "побродить по хелпу не относится".

To y-soft:

Если не трудно варианты получения привелегий для возможности копирования куска реестра в файл.





Anatoly Podgoretsky   (2002-03-26 20:51) [8]

Ответь на такой вопрос, а с помощью regedit ты можещь сохоанить тот же самы ключ в тоже самое место?
Если можешь, то надо разбираться с кодом, если нет то с правами.



SeF   (2002-03-27 03:32) [9]

выполни комманду:
regedit /e имя_файла полный_путь_в_реестре_до_нужного_ключа
например:
regedit /e software_hklm.reg HKEY_LOCAL_MACHINE\SOFTWARE



y-soft   (2002-03-27 09:02) [10]

>Barmutik

1.Вариант использования Regedit привел SeF
2.Порядок получения привилегий следующий:

var
TokenHandle : THandle;
ProcId : DWORD;
Priv, Dummy : TOKEN_PRIVILEGES;
Ver : TOSVERSIONINFO;
const
SE_BACKUP_NAME = "SeBackupPrivilege";
begin
Ver.dwOSVersionInfoSize := Sizeof(Ver);
GetVersionEx(Ver);
if Ver.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin
ProcID := 0;
if (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, TokenHandle)) and
(LookupPrivilegeValue(nil, SE_BACKUP_NAME, Priv.Privileges[0].Luid))
then
begin
Priv.PrivilegeCount := 1;
Priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(TokenHandle, False, Priv, SizeOf(Dummy),
Dummy, ProcId) then
raise Exception.Create(SysErrorMessage(GetLastError));
end
else
raise Exception.Create(SysErrorMessage(GetLastError));
end;
//А здесь поместите код работы с реестром
end;


После этого Microsoft настоятельно рекомендует полученные привилегии аналогичным образом возвратить (установить SE_PRIVILEGE_DISABLED)



Внук   (2002-03-27 09:25) [11]

>>Barmutik ©
Просто побродить по Help"y - это, конечно, совсем никакой совет. Но я ведь указал направление поиска. Ваши слова "Я прочитал про SE_BACKUP_NAME. Также просмотрел ссылку по привилегиям." - тому доказательство. Но жаль, что до конца не разобрались, получили все-таки готовый ответ в виде кода.
Впрочем, хочется верить, что Вы на меня не в обиде. Форум-то не без добрых людей :)))



Barmutik   (2002-03-27 10:17) [12]

Спасибо всем кто отозвался и помог !




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




Наверх





Память: 0.74 MB
Время: 0.02 c
14-22789          ors                   2002-02-25 18:45  2002.04.08  
График как в Sound Forge


3-22604           wicked                2002-03-14 10:03  2002.04.08  
грабли в ADO + JET...


1-22689           Вадим                 2002-03-26 13:43  2002.04.08  
Свой таскбар


3-22528           Gunner                2002-03-14 10:22  2002.04.08  
Не могу разобраться с SET INTEGRITY в DB2


7-22852           Drv                   2001-12-04 18:08  2002.04.08  
Удаленный доступ