Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу записать значение в реестр [D7]


Alex_Bredin ©   (2004-11-24 11:13:00) 

Написал небольшой модуль для облегчения работы с реестром(чтение\запись значений ключей). В одной программе все прекрасно работает. В другой- при вызове той же функции вываливает ERegistryException -не могу записать данные для такого-то параметра. Правда, в первом случае это приложение, во втором- пакет. Есть ли здесь какие-то грабли?

код на всякий случай

unit RegistryUtils;

interface

uses Registry,Variants,Windows;

const RRoot = HKEY_CURRENT_USER;
// finds the key,if not found, returns default
// returns value as variant
function ReadRegistryKeyValue(RegistryKey:string;Param:string;Default:variant):variant;
// finds the key,if not found, creates one & sets its value,
// returns false if failed
function WriteRegistryKeyValue(RegistryKey:string;Param:string;Value:variant):boolean;
// deletes the key
procedure DeleteRegistryKey(RegistryKey:string);

implementation

var vRegistry:Tregistry;

//---------------------------------------------------------------- WriteRegistryKeyValue

function WriteRegistryKeyValue(RegistryKey:string;Param:string;Value:variant): boolean;
var
 vt: integer;
begin
 vt:=VarType(Value);
 vRegistry.CloseKey;
 if vRegistry.OpenKey(RegistryKey,true) then
  begin
   try
     case vt of
       varInteger,varByte,varSmallint: vRegistry.WriteInteger(Param,integer(Value));
       varString:                      vRegistry.WriteString(Param,vartostr(Value));
       varBoolean:                     vRegistry.WriteBool(Param,boolean(Value));
     end;
     Result:=true;
   except
     Result := false;
   end;
   vRegistry.CloseKey;
  end
 else
   Result:=false;
end;

//------------------------------------------------------------ ReadRegistryKeyValue

function ReadRegistryKeyValue(RegistryKey:string;Param:string;Default:variant):variant;
var
 vt: integer;
begin
 Result:=Default;
 vt:=VarType(Default);
 vRegistry.CloseKey;
 try
   if vRegistry.OpenKeyReadOnly(RegistryKey) then
    if vRegistry.ValueExists(Param) then
     case vt of
           varInteger,varByte, varSmallint: Result:=vRegistry.ReadInteger(Param);
                                 varString: Result:=vRegistry.ReadString(Param);
                                varBoolean: Result:=vRegistry.ReadBool(Param);
     end;
 except
 end;
 vRegistry.CloseKey;
end;

//------------------------------------------------------------DeleteRegistryKey
procedure DeleteRegistryKey(RegistryKey:string);
begin
 //
end;

initialization
 vRegistry:=TRegistry.Create;
 vRegistry.RootKey:=RRoot;
finalization
 vRegistry.Free;

e


Jay   (2004-11-24 12:34:00) [1]

Я пробовал как-то работать с реестром, у меня была подобная ошибка, когда делаешь OpenKey, RootKey переприсваивает на путь указаный в OpenKey, и никакие попытки его изменения ничего не давали


TUser   (2004-11-24 12:14:00) [2]


> Почему-то для каждого обращения(по крайней мере, для записи)
> вингдоза требует создания нового объекта TRegistry.

Разве?

И еще - а где ты указываешь RootKey?


Alex_Bredin   (2004-11-24 11:40:00) [3]

Разобрался.

Почему-то для каждого обращения(по крайней мере, для записи) вингдоза требует создания нового объекта TRegistry. Использование вышеприведенного подхода (многократного обращения к одному экземпляру)не прокатывает.


TUser   (2004-11-24 11:15:00) [4]

Наверное, не хватает полномочий.


Наверх

Титульная страница Поиск, карта сайта Написать письмо