Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
3-60982
progger
2002-08-29 09:59
2002.09.19
DBGrid


1-61036
Arm
2002-09-07 01:21
2002.09.19
Привязка библиотек С++ к Делфи


4-61377
pentium
2002-07-30 03:23
2002.09.19
Как определить раскладку в другой программе ?


7-61329
Lex_2000
2002-05-13 13:07
2002.09.19
Проблема переноса программы с Win98 на NT. (+)


3-60954
Rider
2002-08-27 17:06
2002.09.19
Связать таблицы





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