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

Вниз

Реестр, не проходит функция, ХЕЛП.   Найти похожие ветки 

 
madmike ©   (2002-07-18 11:01) [0]

Вот это не работает, пробовал под ХРенью, 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.


 
Digitman ©   (2002-07-18 11:15) [1]

const
sub: string="software";




 
madmike ©   (2002-07-18 11:26) [2]

2 Digitman
Спасибо, а как ты думаешь, я это пробовал? Не проходит. Стринговые комбинации перебирал все(или почти). По хелпам всё правильно.
???????????????????


 
Digitman ©   (2002-07-18 13:01) [3]

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

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

в хэлп-примере к методу 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 скорее всего.


 
madmike ©   (2002-07-18 18:43) [4]

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


 
Digitman ©   (2002-07-18 18:49) [5]

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


 
Digitman ©   (2002-07-18 18:56) [6]


const
sub: string="\software";

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

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


 
troits ©   (2002-07-18 19:09) [7]

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


 
troits ©   (2002-07-18 19:10) [8]

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


 
madmike ©   (2002-07-19 02:42) [9]

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


 
troits ©   (2002-07-19 11:16) [10]

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

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

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

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

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


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

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

Вот 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.


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

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

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

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


 
madmike ©   (2002-07-20 21:54) [13]

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


 
madmike ©   (2002-07-30 11:22) [14]

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


 
Digitman ©   (2002-07-30 12:12) [15]

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

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 12:43) [16]

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


 
Digitman ©   (2002-07-30 13:51) [17]

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


 
madmike ©   (2002-07-30 14:52) [18]

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

Читал. Нихрена не могу понять, не силён я... :(


 
Digitman ©   (2002-07-30 16:13) [19]

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


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

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


 
Внук ©   (2002-07-30 18:45) [21]

>>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-31 01:25) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
1-61075
SergeyDN
2002-09-09 11:39
2002.09.19
Как можно из делфей выбрать определённый лист в Excel!


1-61122
@-leksey
2002-09-04 09:49
2002.09.19
Копирую TMetafile в буфер, а потом вставляю в CorelDraw. Проблемы


1-61108
Andre V.
2002-09-04 09:55
2002.09.19
Работа с DLL


1-61126
bobr12
2002-09-06 10:59
2002.09.19
Delphi + Excel


3-60946
***
2002-08-28 11:16
2002.09.19
TDBGrid