Форум: "WinAPI";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизРеестр, не проходит функция, ХЕЛП. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c