Форум: "Основная";
Текущий архив: 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.018 c