Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по реестру   Найти похожие ветки 

 
zzet   (2002-06-24 20:55) [0]

Здравствуйте мастера!
Помогите начинающему.. Вопрос по реестру. Пишу в реестр так:

var
InF : TReginifile;
max : integer;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Inf := TRegIniFile.Create("MyProga");
Inf.WriteInteger("folder","max",max);
Inf.Free;
end;


Читаю из реестра так:

procedure TForm1.FormCreate(Sender: TObject);
begin
Inf := TRegIniFile.Create("MyProga");
max := Inf.ReadInteger("folder","max",0);
Inf.Free;
end;


Ключ "MyProga" образуется по умолчанию в ключе
HKEY_CURRENT_USER и читается соответственно по умолчанию тоже оттуда. Все это работает, но только на W9x и W9me, и не хочет работать в W2000,
Почему?
Думаю, что запись реестр в окнах с ядром Nt поисходит как-то подругому.. Помогите примером, который бы работал и в W9x и W2000, WNt, WXP.
Может ламерский вопрос, но у меня нет рядом машины с установленной W2000, проверить мысли негде. Спасибо.


 
VID   (2002-06-25 01:27) [1]

У меня работает. Наверное там, где ты пытался запустить код, была заблокирована запись в реестр.


 
zzet   (2002-06-26 00:45) [2]

А можно как-то обойти эту блокировку? Мне нужно регистрировать программу и это не всегда получается...


 
Song   (2002-06-26 08:51) [3]

Надо использовать свойство Access


 
Внук   (2002-06-26 09:18) [4]

"Уж сколько раз твердили миру..."
Под линейкой NT доступ к реестру или отдельной его ветви может быть защищен и определяется привилегиями потока. Свойство Access приводит лишь к запросу требуемого доступа, но никак не к его предоставлению. Для чтения\записи в защищенные ключи надо получить привилегии (вроде SE_BACKUP_NAME или SE_RESTORE_NAME). Или запускать программу под администратором :) См. Win32 Programmer"s Reference, ссылки Privilegies, RegCreateKeyEx


 
zzet   (2002-06-27 10:04) [5]

Значит ли это то, что, что бы точно сохранить настройки\данные под любыми окнами нельзя писать в реестр, а нужно пользоваться обыкновенными ini-файлами?


 
Proton   (2002-06-27 17:42) [6]

Попробуй (может поможет) вот так

var
InF : TReginifile;
max : integer;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Inf := TRegIniFile.Create("MyProga");
inf.Access := KEY_WRITE;
inf.root := HKEY_CURRENT_USER;
Inf.WriteInteger("folder","max",max);
Inf.Free;
end;

И читай вот так

procedure TForm1.FormCreate(Sender: TObject);
begin
Inf := TRegIniFile.Create("MyProga");
inf.Access := KEY_REad;
inf.root := HKEY_CURRENT_USER;
max := Inf.ReadInteger("folder","max",0);
Inf.Free;
end;

ну а если так не выйдет то пользуйся классом TRegistry (и настройки желательно

сохранять в SoftWare\MyProga), при создании устанавливай неоходимый тип доступа

т.е.
Reg := TRegistry.Create(KEY_REad);
try
Reg.RootKey := HKEY_CURRENT_USER;
2Внук - по поводу вашей реплики. Это что ж за зверь(дурак) админ если он туда

доступ закрыл (возможно для записи) - у него ж ни х.. корректно работать не будет.


 
Внук   (2002-06-27 17:54) [7]

>>zzet © (27.06.02 10:04)
Нет, не значит. Реестр в большинстве случаев предпочтительнее. Просто нужно потоку предоставить (программным путем) необходимые привилегии, если программа работает под NT, это нормальный подход. NT и Security - близнецы-братья, надо всегда иметь это в виду.
>>Proton © (27.06.02 17:42)
В ответ на последний вопрос - корректно работать будет, если сама программа написана корректно с учетом особенностей NT. По поводу приведенного примера... А в прочем, пусть автор сам скажет, будет ли это у него работать :) (под WinNT/2000/XP разумеется)


 
Anatoly Podgoretsky   (2002-06-27 19:13) [8]

zzet © (27.06.02 10:04)
Не значит, точнее наоборот, тебе возможно придется поискать куда твой ini поместить


 
Anatoly Podgoretsky   (2002-06-27 19:28) [9]

zzet © (27.06.02 10:04)
Не значит, точнее наоборот, тебе возможно придется поискать куда твой ini поместить


 
Proton (lose password)   (2002-06-27 19:43) [10]


> Внук © (27.06.02 17:54)

Может поделитесь своим примером. Что то вы нас заинтреговали сильно. Очень интересно. : )


 
Anatoly Podgoretsky   (2002-06-27 20:04) [11]

Proton (lose password) (27.06.02 19:43)
На сервере есть кнопка "забыд пароль"


 
zzet   (2002-06-28 02:12) [12]

>Proton Спасибо за пример, попробую.

Мастера! Дискуссия интересная, но вопрос то остался. Скажите а Вы как сохраняете данные\настройки своих программ под все окна? Или тоже только теоретически?
На счет ini - файла, его поместить по дефолту в каталог с программой, может так оно проще будет, и во всех системах работает?


 
Anatoly Podgoretsky   (2002-06-28 09:08) [13]

zzet © (28.06.02 02:12)
Должен тебе разочаровать как администратор, поместить разрешу, а вот писать в папку с программой нет. Речь не про твою личную машину, а шире.


 
Внук   (2002-06-28 09:15) [14]

>>Proton (lose password) (27.06.02 19:43)
Приведенный ниже пример не мой (одного из местных мастеров, имени не помню, sorry), переделывать некогда, но смысл в следующем:

procedure ...
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;

Этот код в свое время предназначался для экспорта ветви реестра в файл. По аналогии можно сделать все остальное. Я же давал ключевые слова для поиска в Help...


 
Внук   (2002-06-28 09:17) [15]

>>zzet © (28.06.02 02:12)
Почему же теоретически :)) За это заказчики деньги не платят :)


 
Proton   (2002-06-28 21:12) [16]


> Anatoly Podgoretsky © (27.06.02 20:04)
> Proton (lose password) (27.06.02 19:43)
> На сервере есть кнопка "забыд пароль"

знаю, бат полетел от почты тоже пароль надо подобрать :)
(вернее уже подобрал)
вот из книжки рихтера

WINDOWS 98:
Хотя в большинстве приложений нет нужды беспокоиться о защите, многие функции Windows требуют, чтобы Вы передавали им информацию о нужном уровне защиты. Некоторые приложения, написанные для Windows 98, в Windows 2000 толком не работают из-за того, что при их реализации не было уделено должного внимания защите.

Представьте, что при запуске приложение считывает данные из какого-то раздела реестра Чтобы делать это коррекчно, оно должно вызывать функцию RegOpenKeyEx, передавая значение KEY_QUERY_VALUE, которое разрешает операцию чтения в указанном разделе.

Однако многие приложения для Windows 98 создавались без учета специфики Windows 2000 Поскольку Windows 98 не защищает свой реестр, разработчики часто вызывали RegQpenKeyEx со значением KEY_ALL_ACCESS. Так проще и не надо ломать голову над том, какой уровень доступа требуется на самом деле. Но проблема в том, что раздел реестра может быть доступен для чтения и блокирован для записи. В Windows 2000 вызов RegOpenKeyEx со значением KEY_ALL_ACCESS заканчивается неудачно, и без соответствующего контроля ошибок приложение может повести себя совершенно непредсказуемо.

Если бы разработчик хоть немного подумал о защите и поменял значение KEY_ALL_ACCESS на KEY_QUERY_VALUE (только-то и всего!), его продукт мог бы работать в обеих операционных системах

Пренебрежение флагами, определяющими уровень доступа, — одна из самых крупных ошибок, совершаемых разработчиками Правильное их использование позволило бы легко перенести многие приложения Windows 98 в Windows 2000


 
zzet   (2002-06-28 22:14) [17]

Всем мастерам спасибо!
>>Proton Будьте до конца великодушны, если есть электронный вариант такой книги\статьи - дайте ссылку.


 
Proton   (2002-06-29 13:30) [18]

зачем вам - там все про Visual с++ хотя вещь крайне полезная даже хочу купить печатный вариант.
http://mbo88.chat.ru/rchtbook.zip



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
4-47910
stainer a
2002-05-10 08:00
2002.07.15
сообщение em_settextex


1-47363
andrey_pst
2002-07-02 06:32
2002.07.15
Как определить, загружена ли программа ?


4-47911
KiberArt
2002-05-11 10:52
2002.07.15
The KeyboardProc hook procedure is an application-defined


4-47902
whc
2002-05-15 17:45
2002.07.15
Соответствие пароля и логина в NT


4-47867
Sergo
2002-05-06 13:13
2002.07.15
Приоритет





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