Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реестр, не проходит функция, ХЕЛП. [D5, WinXP]


Страницы:   1 2

madmike ©   (2002-07-18 11:01:00) 

Вот это не работает, пробовал под ХРенью, 98се на Дел5, в чем дело ? хез:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
registry, Dialogs, StdCtrls;

const
sub: string="software\";
var
Form1: TForm1;
reg:TRegistry;


implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey(sub,true);
if (not reg.SaveKey(sub,"c:\registr.reg")) then
begin
showmessage("error");
reg.free;
application.terminate;
end;
reg.free;
end;
end.


madmike   (2002-07-31 01:25:00) [1]

2 Внук
Ай-ай-ай! Спасибо, я должник!


Внук   (2002-07-30 18:45:00) [2]

>>Digitman © Прошу прощения, что вмешиваюсь...

>>madmike © Получение привилегии (код не мой):

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;


madmike   (2002-07-30 17:00:00) [3]

2 Digitman
Я понял, что мне нужно выполнить какое-то разрешение на сохранение реестра(может действует и не только на реестр), в хелпе говорится о функциях RegGetKeySecurity(), RegSetKeySecurity(), т.е. с помощью них можно что-то узнать(о правах, безопасности) и установить права. Так вот мне необходимо перед операцией сохранения ветки реестра эту процедуру разрешить. Вопрос: Как?


Digitman   (2002-07-30 16:13:00) [4]

Так давай по каждому "хрену" в вышеозначенном "нихрена"-списке отдельно беседовать)... Задавай вопрос по очередному непонятному "хрену" - постараюсь ответить "нехреново" ...


madmike   (2002-07-30 14:52:00) [5]

см. API-ф-ции :
RegGetKeySecurity(), RegSetKeySecurity()
Читал. Нихрена не могу понять, не силён я... :(


Digitman   (2002-07-30 13:51:00) [6]

см. API-ф-ции :
RegGetKeySecurity(), RegSetKeySecurity()


madmike   (2002-07-30 12:43:00) [7]

Нашёл:
SE_BACKUP_NAME требует выполнять операции сохранения, можешь подсказать что с этим делать и как это побороть? Плз.


Digitman   (2002-07-30 12:12:00) [8]

Вчитайся и проверь эти условия :

The RegSaveKey function saves only nonvolatile keys. It does not save volatile keys. A key is made volatile or nonvolatile at its creation; see RegCreateKeyEx.

Windows NT: The calling process must have the SE_BACKUP_NAME privilege. For more information about privileges, see Privileges.


madmike   (2002-07-30 11:22:00) [9]

Мужики, спецы! Не бросайте в беде! Разъясните, пожалуйста. :(


madmike   (2002-07-20 21:54:00) [10]

Нихрена не проходит, я в шоке, но по твоему коду создаётся пустой файл, но ошибку вываливает всё-равно :(


Digitman   (2002-07-19 11:42:00) [11]

Извини, запарился я уже с этими слэшами)))

вот это работает :

const
sub: string="\software";
...


Digitman   (2002-07-19 11:39:00) [12]

Слушай, ну у меня все с ведущим бэкслэшем работает !

Вот 100%-но работающий у меня код (D5.5, W2k Pro SP2):

const
sub: string="software\";
...

reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey(sub,true) then
try
if (not reg.SaveKey(sub,"c:\registr")) then
showmessage("error");
finally
reg.free;
end;


По дешифрации кода отказа RegSaveKey() (хэлп):

If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.


troits   (2002-07-19 11:16:00) [13]

>Если я правильно тебя понял, то Винда спецом не даёт эту операцию?
Да. Для выполнения этой ф-ции процесс юзера должен иметь привилегии на BackUp. По - моему, как правило, их нет. По крайней мере, у меня :)

>Не понял: Проверь код ошибки , возвращаемый RegSaveKey

Если ты в отладчике "войдешь" в SaveKey, то увидишь, что там вызывается API - ф-ция RegSaveKey. Кстати, а что возвращает сама SaveKey?

Так вот, даже если ты и установишь необходимые привилегии, мне кажется, это тебя не спасет, так как формат, в котором будет записана ветка реестра - не текстовый, и , более того, различен для разных версий Windows.

Для сохранения ветки придется, ИМХО, самому все писать в своём формате, или поискать уже готовые решения.


madmike   (2002-07-19 02:42:00) [14]

Код ошибки "0" по getlasterror. Куда я только слэши не ставил :(
2 troits:
Если я правильно тебя понял, то Винда спецом не даёт эту операцию?
Подскажи, как запустить эту хренотень, надо, блинн, кровь из носу.
Не понял:
Проверь код ошибки , возвращаемый RegSaveKey


troits   (2002-07-18 19:10:00) [15]

Поправка: приоритета читать как привилегии


troits   (2002-07-18 19:09:00) [16]

Да.. Где-то я уже это видел...
ИМХО, проблема в том, что твой процесс не имеет приоритета SE_BACKUP_NAME !!!. Проверь код ошибки , возвращаемый RegSaveKey, которая вызывается из reg.SaveKey.


Digitman   (2002-07-18 18:56:00) [17]


const
sub: string="\software";

я тоже ведущий бэкслэш упустил из виду)

он нужен обязательно


Digitman   (2002-07-18 18:49:00) [18]

нет, ну а что говорит GetLastError()-то ? После выполнения SaveKey() ?


madmike   (2002-07-18 18:43:00) [19]

Open ошибку не даёт. Без расширения не проходит тоже, имена менял. ????????? Кто-нить попробуйте прогнать процедуру, плз.


Digitman   (2002-07-18 13:01:00) [20]

Хм... "По хэлпам все правильно", говоришь ?

Да нет, сударь, по хэлпам как раз неправильно у тебя получается ...

в хэлп-примере к методу TRegistry.OpenKey() есть как минимум следующее :

if Reg.OpenKey("...", True) then ...

Почувствуй разницу. Борланд настоятельно рекомендует тебе анализировать булев результат, возвращаемый OpenKey(), а ты этого не делаешь почему-то. И , соответственно, не знаешь : то ли OpenKey() не работает, то ли SaveKey() ...

OpenKey(), конечно, не дает отказ у тебя, но в общем случае такая проверка должна присутствовать.

Отказ дает у тебя SaveKey(), потому что ты не в читался (или проигнорировал) в по кр.мере одно из условий того же упомянутого тобой хэлпа по SaveKey().

Цитирую описание второго параметра FileName:

FileName is the file into which to save the key information. It must be the name of a new file that does not already exist. On FAT file systems FileName cannot include an extension.

Вчитался ? Принимай меры - и все заработает)

А у тебя - FAT скорее всего.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо