Поместить и удалить программу из автозапуска реестра

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

There’s a RunOnce key in the registry.

When a user logs on, the programs in the run-once list are run just once,

and then the entries will be removed.

The «runonce» key is normally used by setup programs to install

software after a machine has been rebooted.

}

{

Jede Anwendung, die im Schlьssel RunOnce aufgefьhrt ist, wird

beim nдchsten Windowsstart ausgefьhrt und anschlieЯend wieder

aus der Registry entfernt. Betrifft Anwendungen, die nur einmal

mit Windows gestartet werden sollen. Normalerweise wird dieser Schlьssel

von Setup Programmen genutzt, um nach einem Neustart mit der Installation

fortzufahren.

}

// Add the application to the registry…

// Anwendung in die Registry aufnehmen…

procedure DoAppToRunOnce(RunName, AppName: string);

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\RunOnce’, True);

WriteString(RunName, AppName);

CloseKey;

Free;

end;

end;

// Check if the application is in the registry…

// Prьfen, ob Anwendung in der Registry vorhanden ist…

function IsAppInRunOnce(RunName: string): Boolean;

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\RunOnce’, False);

Result := ValueExists(RunName);

CloseKey;

Free;

end;

end;

// Remove the application from the registry…

// Anwendung aus der Registry entfernen…

procedure DelAppFromRunOnce(RunName: string);

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\RunOnce’, True);

if ValueExists(RunName) then DeleteValue(RunName);

CloseKey;

Free;

end;

end;

{

Applications under the key «Run» will be executed

each time the user logs on.

{

{

Jede Anwendung, die im Schlьssel Run aufgefьhrt ist, wird beim

jedem Windowsstart ausgefьhrt. Betrifft Anwendungen, die immer

mit Windows gestartet werden sollen…

}

// Add the application to the registry…

// Anwendung in die Registry aufnehmen…

procedure DoAppToRun(RunName, AppName: string);

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, True);

WriteString(RunName, AppName);

CloseKey;

Free;

end;

end;

// Check if the application is in the registry…

// Prьfen, ob Anwendung in der Registry vorhanden ist…

function IsAppInRun(RunName: string): Boolean;

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, False);

Result := ValueExists(RunName);

CloseKey;

Free;

end;

end;

// Remove the application from the registry…

// Anwendung aus der Registry entfernen…

procedure DelAppFromRun(RunName: string);

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

with Reg do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, True);

if ValueExists(RunName) then DeleteValue(RunName);

CloseKey;

Free;

end;

end;

// Examples, Beispiele

// Add app, Anwendung aufnehmen…

DoAppToRun(‘Programm’, ‘C:\Programs\XYZ\Program.exe’);

// Is app there ? Ist Anwendung vorhanden?

if IsAppInRun(‘Programm’) then…

// Remove app, Anwendung entfernen

DelAppFromRun(‘Programm’);

{/codecitation}

Получить многострочные значения из реестра и преобразовать их в TStringList

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

function ReadMultirowKey(reg: TRegistry; Key: string): TStrings;

const

bufsize = 100;

var

i: integer;

s1: string;

sl: TStringList;

bin: array[1..bufsize] of char;

begin

try

result := nil;

sl := nil;

sl := TStringList.Create;

if not Assigned(reg) then

raise Exception.Create(‘TRegistry object not assigned.’);

FillChar(bin, bufsize, #0);

reg.ReadBinaryData(Key, bin, bufsize);

i := 1;

s1 := »;

while i < bufsize do

begin

if ord(bin[i]) >= 32 then

s1 := s1 bin[i]

else

begin

if Length(s1) > 0 then

begin

sl.Add(s1);

s1 := »;

end;

end;

inc(i);

end;

result := sl;

except

sl.Free;

raise;

end;

end;

{/codecitation}

Получить количество вложенных ключей и значений ветви реестра

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: ___Nikolay

WEB-сайт: http://delphiworld.narod.ru

uses Registry;

// Количество вложенных ключей и значений

procedure TForm1.Button1Click(Sender: TObject);

const

sKey = ‘\SOFTWARE\Microsoft\Windows\CurrentVersion’;

var

rReg: TRegistry;

ki: TRegKeyInfo;

begin

rReg := TRegistry.Create;

with rReg do

begin

RootKey := HKEY_LOCAL_MACHINE;

if KeyExists(sKey) then

begin

OpenKey(sKey, false);

GetKeyInfo(ki);

CloseKey;

lbSubkeys.Caption := IntToStr(ki.NumSubKeys);

lbValues.Caption := IntToStr(ki.NumValues);

end;

end;

rReg.Free;

end;

{/codecitation}

Получить из регистров информацию о временной зоне (DST)

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

12 Заповедей от Админа.

1. Прав всегда Админ, ибо в трех лицах есть он единая власть высшая в классе дисплейном!

2. Неправ вечно юзер, ибо прав всегда Админ!

3. Не возжелай ни места, ни системника, ни профиля, ни монитора, ни мыши Админа своего, и да пребудет с тобой вечное благословение его! 4. И если вошел Юзер в систему без высшего на то дозволения (Админа) — горе ему, ибо порушится профиль его!

5. Да убоится юзер установить прогу неустановленную на комп казенный — ибо не дозволено сие!

6. Да не будет превышен профиль юзерский, ибо сказал Админ: «Аз воздам за то обрезанием… профиля твоего!»

7. Не возжелай войти под паролем чужим в систему, ибо надолго потом из дисплейки выйдешь ты!

8. А если кто разрешение на папку сменит — горе юзеру этому, ибо всемогущ в системе своей Админ!

9. Да убоятся пользователи толпиться на местах своих подобно стадам овец безмозглых, ибо всеведущ Админ!

10. И да убоится юзер качать вирусы, ибо админомерзкое занятие сие!

11. А если кто из юзеров возжелает порнухи или чата админа своего — горе и позор ему, ибо высшие удовольствия эти лишь Админу дозволены!

12. А тот юзер, который прочел строки эти и не проникся смирением и не осознал, что тварь он ламероидная и чайник нечищенный в сиянии славы высшего существа Админоподобного — горе ему, ибо навеки отлучены они будут от сети великой!!!

Во имя отца Билли Гейтса, и сына его Microsofta, и святого духа админовского.

HKEYLocalMachine/Software/Microsoft/Windows/CurrentVersion/TimeZones/ — место, где в регистре хранится информация о временных зонах (Timezone). Двоичный код ‘TZI’ хранит информацию о начале и конце летнего времени. Есть какие-нибудь идеи насчет извлечения этих дат из этой двоичной величины?

Ок, попробую здесь описать бинарную структуру значения TZI:

int32 Bias; // Минуты от GMT

// (Сидней -600; 0xfffffda8;

// или a8, fd, ff, ff)

int32 StandardBias; // Смещение для стандартного времени (0)

int32 DaylightBias; // Смещение для летнего времени (-60

// или 0xffffffc4 )

int16 ?? // 0

int16 StandardStartMonth; // 3 => Март

int16 StandardStartDayOfWeek??; // 0 => Воскресенье

int16 StandardStartDOWoccurrence; // 1 => 1-й

int16 StandardStartHour; // 2 => 02:00:00.00

int16 StandardStartMins??; // 0 => 02:00:00.00

int16 StandardStartSecs??; // 0 => 02:00:00.00

int16 StandardStartHunds??; // 0 => 02:00:00.00

int16 ?? // 0

int16 DaylightStartMonth; // 0x0a (10) => Октябрь

int16 DaylightStartDayOfWeek??; // 0 => Воскресенье

int16 DaylightStartDOWoccurrence; // 5 => последний

int16 DaylightStartHour; // 2 => 02:00:00.00

int16 DaylightStartMins??; // 0 => 02:00:00.00

int16 DaylightStartSecs??; // 0 => 02:00:00.00

int16 DaylightStartHunds??; // 0 => 02:00:00.00

{/codecitation}

Получаем из реестра количество активных потоков, загруженность процессора и т.д.

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Vimil Saju

Я выбросил из окна два компа — 386 и 486. В самом деле, 486 был быстрее…

В реестре есть раздел HKEY_DYN_DATA. Основная информация о системе хранится в ключе PerfStats.

О получении информации,например, о загруженности процессора, необходимо проделать следующие шаги:

Для начала необходимо запустить установленный счётчик в реестре. Это возможно путём считывания значения ключа, отвечающего за нужный параметр системы.

Например

Просто считываем значение ключа ‘PerfStats\StartStat\KERNEL\CPUusage’ в секции HKEY_DYN_DATA. данное действие запускает счётчик. После этого в ключе ‘PerfStats\StatData\KERNEL\CPUusage’ будет храниться значение в процентах о загруженности процессора.

Далее, если добавить считывание загруженности процессора в событие On timer, то мы сможем наблюдать изменение загруженности процессора в динамике.

По завершении, Ваша программа должна остановить счётчик в реестре. Для этого просто считай ключ ‘PerfStats\StopStat\KERNEL\CPUusage’.Это остановит счётчик.

Так же в системе есть много других счётчиков. Весь список счётчиков можно посмотреть в ключе PerfStats\StatData, используя редактор реестра.

Представленный ниже исходник получает значения всех счётчиков, расположенных в секции HKEY_DYN_DATA.

unit SystemInfo;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs,extctrls;

//Информация о Dialup адаптере

type TDialupAdapterInfo = record

alignment:dword;

buffer:dword;

bytesrecieved:dword;

bytesXmit:dword;

ConnectSpeed:dword;

CRC:dword;

framesrecieved:dword;

FramesXmit:dword;

Framing:dword;

runts:dword;

Overrun:dword;

timeout:dword;

totalbytesrecieved:dword;

totalbytesXmit:dword;

end;

type TKernelInfo = record

CpuUsagePcnt:dword;

Numthreads:dword;

NumVMS:dword;

end;

type TVCACHEInfo = record

ccurpages:dword;

cMacPages:dword;

cminpages:dword;

FailedRecycles:dword;

Hits:dword;

LRUBuffers:dword;

LRURecycles:dword;

Misses:dword;

RandomRecycles:dword;

end;

type TFATInfo = record

BreadsSec:dword;

BwritesSec:dword;

Dirtydata:dword;

ReadsSec:dword;

WritesSec:dword;

end;

type TVMMInfo = record

CDiscards:dword;

CInstancefaults:dword;

CPageFaults:dword;

cPageIns:dword;

cPageOuts:dword;

cpgCommit:dword;

cpgDiskCache:dword;

cpgDiskCacheMac:dword;

cpgDiskCacheMid:dword;

cpgDiskCacheMin:dword;

cpgfree:dword;

cpglocked:dword;

cpglockedNoncache:dword;

cpgother:dword;

cpgsharedpages:dword;

cpgswap:dword;

cpgswapfile:dword;

cpgswapfiledefective:dword;

cpgswapfileinuse:dword;

end;

type

TSysInfo = class(TComponent)

private

fDialupAdapterInfo:TDialupAdapterInfo;

fKernelInfo:TKernelInfo;

fVCACHEInfo:TVCACHEInfo;

fFATInfo:TFATInfo;

fVMMInfo:TVMMInfo;

ftimer:TTimer;

fupdateinterval:integer;

tmp:dword;

vsize:dword;

pkey:hkey;

regtype:pdword;

fstopped:boolean;

procedure fupdatinginfo(sender:tobject);

procedure fsetupdateinterval(aupdateinterval:integer);

protected

fsysInfoChanged:TNotifyEvent;

public

constructor Create(Aowner:Tcomponent);override;

destructor Destroy;override;

property DialupAdapterInfo: TDialupAdapterInfo read fDialupAdapterInfo;

property KernelInfo: TKernelInfo read fKernelInfo;

property VCACHEInfo: TVCACHEInfo read fVCACHEInfo;

property FATInfo: TFATInfo read fFATInfo;

property VMMInfo: TVMMInfo read fVMMInfo;

procedure StartRecievingInfo;

procedure StopRecievingInfo;

published

property SysInfoChanged:TNotifyEvent read fsysInfoChanged write

fsysInfoChanged;//Это событие вызывается после определённого интервала времени.

property UpdateInterval:integer read fupdateInterval write

fsetupdateinterval default 5000;

end;

procedure register;

implementation

constructor TSysInfo.Create(Aowner:Tcomponent);

begin

inherited;

ftimer:=ttimer.Create(self);

ftimer.enabled:=false;

ftimer.OnTimer:=fupdatinginfo;

vsize:=4;

fstopped:=true;

end;

procedure TSysInfo.startrecievingInfo;

var

res:integer;

begin

res:=RegOpenKeyEx(HKEY_DYN_DATA, ‘PerfStats\StartStat’,0,KEY_ALL_ACCESS,pkey);

if res0 then

raise exception.Create(‘Could not open registry key’);

fstopped:=false;

// Для Dial Up Адаптера

RegQueryValueEx(pkey,’Dial-Up Adapter\Alignment’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Buffer’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Framing’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Overrun ‘,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Timeout’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\CRC’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Runts’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\ConnectSpeed’,nil,regtype,@tmp,@vsize);

// Для VCACHE

RegQueryValueEx(pkey,’VCACHE\LRUBuffers’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\FailedRecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\RandomRecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\LRURecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\Misses’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\Hits’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMacPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMinPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cCurPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesXmit’,nil,regtype,@tmp,@vsize);

//Для VFAT

RegQueryValueEx(pkey,’VFAT\DirtyData’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\BReadsSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\BWritesSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\ReadsSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\WritesSec’,nil,regtype,@tmp,@vsize);

//Для VMM

RegQueryValueEx(pkey,’VMM\cpgLockedNoncache’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgCommit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSharedPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMid’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMac’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMin’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcache’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileDefective’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileInUse’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfile’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cDiscards’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageOuts’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageIns’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cInstanceFaults’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageFaults’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgOther’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwap’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgLocked’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgFree’,nil,regtype,@tmp,@vsize);

//Для KERNEL

RegQueryValueEx(pkey,’KERNEL\CPUUsage’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’KERNEL\VMs’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’KERNEL\Threads’,nil,regtype,@tmp,@vsize);

RegCloseKey(pkey);

ftimer.enabled:=true;

end;

procedure tsysinfo.fupdatinginfo(sender:tobject);

var

res:integer;

begin

res:=RegOpenKeyEx(HKEY_DYN_DATA, ‘PerfStats\StatData’,0,KEY_ALL_ACCESS,pkey);

if res0 then

raise exception.Create(‘Could not open registry key’);

//Для Dial Up Адаптера

RegQueryValueEx(pkey,’Dial-Up Adapter\Alignment’,nil,regtype,@fDialupAdapterInfo.alignment,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Buffer’,nil,regtype,@fDialupAdapterInfo.buffer,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Framing’,nil,regtype,@fDialupAdapterInfo.framing,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Overrun ‘,nil,regtype,@fDialupAdapterInfo.overrun,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Timeout’,nil,regtype,@fDialupAdapterInfo.timeout,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\CRC’,nil,regtype, @fDialupAdapterInfo.crc,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Runts’,nil,regtype,@fDialupAdapterInfo.runts,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesXmit’,nil,regtype,@fDialupAdapterInfo.framesxmit,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesRecvd’,nil,regtype, @fDialupAdapterInfo.framesrecieved,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesXmit’,nil,regtype,@fDialupAdapterInfo.bytesxmit,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesRecvd’,nil,regtype, @fDialupAdapterInfo.bytesrecieved,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesXmit’,nil,regtype, @fDialupAdapterInfo.totalbytesxmit,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesRecvd’,nil,regtype, @fDialupAdapterInfo.totalbytesrecieved,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\ConnectSpeed’,nil,regtype, @fDialupAdapterInfo.connectspeed,@vsize);

// Для VCACHE

RegQueryValueEx(pkey,’VCACHE\LRUBuffers’,nil,regtype, @fVCACHEInfo.lrubuffers,@vsize);

RegQueryValueEx(pkey,’VCACHE\FailedRecycles’,nil,regtype, @fVCACHEInfo.failedrecycles,@vsize);

RegQueryValueEx(pkey,’VCACHE\RandomRecycles’,nil,regtype, @fVCACHEInfo.randomrecycles,@vsize);

RegQueryValueEx(pkey,’VCACHE\LRURecycles’,nil,regtype, @fVCACHEInfo.lrurecycles,@vsize);

RegQueryValueEx(pkey,’VCACHE\Misses’,nil,regtype, @fVCACHEInfo.misses,@vsize);

RegQueryValueEx(pkey,’VCACHE\Hits’,nil,regtype,@fVCACHEInfo.hits,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMacPages’,nil,regtype, @fVCACHEInfo.cmacpages,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMinPages’,nil,regtype, @fVCACHEInfo.cminpages,@vsize);

RegQueryValueEx(pkey,’VCACHE\cCurPages’,nil,regtype, @fVCACHEInfo.ccurpages,@vsize);

//Для VFAT

RegQueryValueEx(pkey,’VFAT\DirtyData’,nil,regtype, @ffatinfo.dirtydata,@vsize);

RegQueryValueEx(pkey,’VFAT\BReadsSec’,nil,regtype, @ffatinfo.breadssec,@vsize);

RegQueryValueEx(pkey,’VFAT\BWritesSec’,nil,regtype, @ffatinfo.bwritessec,@vsize);

RegQueryValueEx(pkey,’VFAT\ReadsSec’,nil,regtype, @ffatinfo.readssec,@vsize);

RegQueryValueEx(pkey,’VFAT\WritesSec’,nil,regtype, @ffatinfo.writessec,@vsize);

//Для VMM

RegQueryValueEx(pkey,’VMM\cpgLockedNoncache’,nil,regtype, @fvmminfo.cpglockednoncache,@vsize);

RegQueryValueEx(pkey,’VMM\cpgCommit’,nil,regtype, @fvmminfo.cpgcommit,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSharedPages’,nil,regtype, @fvmminfo.cpgsharedpages,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMid’,nil,regtype, @fvmminfo.cpgdiskcacheMid,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMac’,nil,regtype, @fvmminfo.cpgdiskcacheMac,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMin’,nil,regtype, @fvmminfo.cpgdiskcacheMin,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcache’,nil,regtype, @fvmminfo.cpgdiskcache,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileDefective’,nil,regtype, @fvmminfo.cpgswapfiledefective,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileInUse’,nil,regtype, @fvmminfo.cpgswapfileinuse,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfile’,nil,regtype, @fvmminfo.cpgswapfile,@vsize);

RegQueryValueEx(pkey,’VMM\cDiscards’,nil,regtype, @fvmminfo.cdiscards,@vsize);

RegQueryValueEx(pkey,’VMM\cPageOuts’,nil,regtype, @fvmminfo.cpageouts,@vsize);

RegQueryValueEx(pkey,’VMM\cPageIns’,nil,regtype, @fvmminfo.cpageins,@vsize);

RegQueryValueEx(pkey,’VMM\cInstanceFaults’,nil,regtype, @fvmminfo.cinstancefaults,@vsize);

RegQueryValueEx(pkey,’VMM\cPageFaults’,nil,regtype, @fvmminfo.cpagefaults,@vsize);

RegQueryValueEx(pkey,’VMM\cpgOther’,nil,regtype, @fvmminfo.cpgother,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwap’,nil,regtype, @fvmminfo.cpgswap,@vsize);

RegQueryValueEx(pkey,’VMM\cpgLocked’,nil,regtype, @fvmminfo.cpglocked,@vsize);

RegQueryValueEx(pkey,’VMM\cpgFree’,nil,regtype, @fvmminfo.cpgfree,@vsize);

//Для KERNEL

RegQueryValueEx(pkey,’KERNEL\CPUUsage’,nil,regtype, @fkernelinfo.cpuusagepcnt,@vsize);

RegQueryValueEx(pkey,’KERNEL\VMs’,nil,regtype,@fkernelinfo.numvms,@vsize);

RegQueryValueEx(pkey,’KERNEL\Threads’,nil,regtype, @fkernelinfo.numThreads,@vsize);

RegCloseKey(pkey);

if assigned(SysInfoChanged) then

SysInfoChanged(self);

end;

procedure TSysInfo.stoprecievingInfo;

var

res:integer;

begin

res:=RegOpenKeyEx(HKEY_DYN_DATA, ‘PerfStats\StopStat’,0,KEY_ALL_ACCESS,pkey);

if not fstopped then

begin

if res0 then

raise exception.Create(‘Could not open registry key’);

//Для Dial Up Адаптера

RegQueryValueEx(pkey,’Dial-Up Adapter\Alignment’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Buffer’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Framing’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Overrun ‘,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Timeout’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\CRC’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\Runts’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\FramesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesXmit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\TotalBytesRecvd’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\ConnectSpeed’,nil,regtype,@tmp,@vsize);

// Для VCACHE

RegQueryValueEx(pkey,’VCACHE\LRUBuffers’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\FailedRecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\RandomRecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\LRURecycles’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\Misses’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\Hits’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMacPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cMinPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VCACHE\cCurPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’Dial-Up Adapter\BytesXmit’,nil,regtype,@tmp,@vsize);

//Для VFAT

RegQueryValueEx(pkey,’VFAT\DirtyData’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\BReadsSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\BWritesSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\ReadsSec’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VFAT\WritesSec’,nil,regtype,@tmp,@vsize);

//Для VMM

RegQueryValueEx(pkey,’VMM\cpgLockedNoncache’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgCommit’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSharedPages’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMid’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMac’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcacheMin’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgDiskcache’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileDefective’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfileInUse’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwapfile’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cDiscards’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageOuts’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageIns’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cInstanceFaults’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cPageFaults’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgOther’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgSwap’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgLocked’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’VMM\cpgFree’,nil,regtype,@tmp,@vsize);

//Для KERNEL

RegQueryValueEx(pkey,’KERNEL\CPUUsage’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’KERNEL\VMs’,nil,regtype,@tmp,@vsize);

RegQueryValueEx(pkey,’KERNEL\Threads’,nil,regtype,@tmp,@vsize);

RegCloseKey(pkey);

ftimer.enabled:=false;

fstopped:=true;

end;

end;

procedure tsysinfo.fsetupdateinterval(aupdateinterval:integer);

begin

if (ftimernil) and(aupdateinterval>0) then

begin

ftimer.Interval:=aupdateinterval;

fupdateinterval:=aupdateinterval;

end;

if (ftimernil) and(aupdateinterval=0) then

begin

ftimer.Interval:=500;

fupdateinterval:=500;

end;

end;

destructor tsysinfo.Destroy;

begin

StopRecievingInfo;

ftimer.Destroy;

inherited;

end;

procedure register;

begin

RegisterComponents(‘Samples’, [TSysInfo]);

end;

end.

Скопируйте это в файл .pas и проинсталлируйте его.

{/codecitation}

Перечислить ключи реестра

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

This example demonstrates how to enumerate all registry keys from

a certain key (here: HKEY_CURRENT_USER)

}

{

Dieses Beispiel listet alle Eintrage eines bestimmten Schlussels

in der Registrierung auf. (hier: HKEY_CURRENT_USER)

}

uses

Registry;

procedure TForm1.Button1Click(Sender: TObject);

var

indent: Integer;

procedure EnumAllKeys(hkey: THandle);

var

l: TStringList;

n: Integer;

begin

Inc(indent, 2);

with TRegistry.Create do

try

RootKey := hkey;

OpenKey(EmptyStr, False);

l := TStringList.Create;

try

GetKeynames(l);

CloseKey;

for n := 0 to l.Count — 1 do

begin

memo1.Lines.Add(StringOfChar(‘ ‘, indent) l[n]);

if OpenKey(l[n], False) then

begin

EnumAllKeys(CurrentKey);

CloseKey;

end;

end;

finally

l.Free

end;

finally

Free;

end;

Dec(indent, 2);

end;

begin

Memo1.Clear;

Memo1.Lines.Add(‘Keys under HKEY_CURRENT_USER’);

indent := 0;

Memo1.Lines.BeginUpdate;

try

EnumAllKEys(HKEY_CURRENT_USER);

finally

Memo1.Lines.EndUpdate;

end;

end;

{/codecitation}

Перечислить измененные ключи реестра в определенный диапазон времени

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

unit Main;

interface

uses

Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Registry, StdCtrls, ComCtrls, ExtCtrls;

type

TFrmMain = class(TForm)

Memo1: TMemo;

btEnumReg: TButton;

dtBeginDate: TDateTimePicker;

dtEndDate: TDateTimePicker;

dtBeginTime: TDateTimePicker;

dtEndTime: TDateTimePicker;

Panel1: TPanel;

Label1: TLabel;

Label2: TLabel;

procedure btEnumRegClick(Sender: TObject);

private

{ Private declarations }

RegDate: TDateTime;

RegKeyInfo: TRegKeyInfo;

TimeZoneInfo: TTimeZoneInformation;

function DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime;

procedure FileTimeToDateTime(ft: TFileTime; var dt: TDateTime);

public

{ Public declarations }

end;

var

FrmMain: TFrmMain;

implementation

{$R *.dfm}

function TFrmMain.DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime;

begin

case GetTimeZoneInformation(TimeZoneInfo) of

TIME_ZONE_ID_STANDARD:

Result := DateTime — (TimeZoneInfo.Bias / 60 / 24);

TIME_ZONE_ID_DAYLIGHT:

Result := DateTime — ((TimeZoneInfo.Bias TimeZoneInfo.DaylightBias) / 60 / 24);

else

Result := 0;

end;

end;

procedure TFrmMain.FileTimeToDateTime(ft: TFileTime; var dt: TDateTime);

var

SystemTime: TSystemTime;

FileTime: TFileTime;

begin

if FileTimeToLocalFileTime(ft, FileTime) then

begin

FileTimeToSystemTime(ft, SystemTime);

dt := SystemTimeToDateTime(SystemTime);

end;

end;

procedure TFrmMain.btEnumRegClick(Sender: TObject);

var

Inizio, Fine: TDateTime;

procedure EnumAllKeys(hkey: THandle; KeyName: string);

var

l: TStringList;

n: Integer;

KeyName_: string;

begin

KeyName_ := KeyName;

with TRegistry.Create do

try

RootKey := hkey;

OpenKey(EmptyStr, False);

l := TStringList.Create;

try

GetKeynames(l);

CloseKey;

for n := 0 to l.Count — 1 do

begin

if OpenKey(l[n], False) then

begin

GetKeyInfo(RegKeyInfo);

with RegKeyInfo do

begin

FileTimeToDateTime(FileTime, RegDate);

RegDate := DateTimeToLocalDateTime(RegDate);

end;

if (RegDate = Inizio) then

memo1.Lines.Add(DateTimeToStr(RegDate) ‘ — ‘ KeyName_ ‘\’ l[n]);

EnumAllKeys(CurrentKey, KeyName_ ‘\’ l[n]);

CloseKey;

end;

end;

finally

l.Free

end;

finally

Free;

end;

end;

begin

Memo1.Clear;

Memo1.Lines.BeginUpdate;

Inizio := int(dtBeginDate.DateTime) frac(dtBeginTime.DateTime);

Fine := int(dtEndDate.Date) frac(dtEndTime.DateTime);

try

EnumAllKeys(HKEY_CURRENT_USER, ‘HKey_Current_User’);

finally

Memo1.Lines.EndUpdate;

end;

MessageDlg(‘Enumeration ended’, mtInformation, [mbOK], 0);

end;

end.

{/codecitation}

Перейти на определенный ключ в RegEdit

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

unit Unit1;

interface

uses

Windows, Messages, Classes, Controls, Forms, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

procedure JumpToKey(Key: string);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

uses

ShellAPI;

procedure TForm1.JumpToKey(Key: string);

var

i, n: Integer;

hWin: HWND;

ExecInfo: ShellExecuteInfoA;

begin

hWin := FindWindowA(PChar(‘RegEdit_RegEdit’), nil);

if hWin = 0 then

{if Regedit doesn’t run then we launch it}

begin

FillChar(ExecInfo, 60, #0);

with ExecInfo do

begin

cbSize := 60;

fMask := SEE_MASK_NOCLOSEPROCESS;

lpVerb := PChar(‘open’);

lpFile := PChar(‘regedit.exe’);

nShow := 1;

end;

ShellExecuteExA(@ExecInfo);

WaitForInputIdle(ExecInfo.hProcess, 200);

hWin := FindWindowA(PChar(‘RegEdit_RegEdit’), nil);

end;

ShowWindow(hWin, SW_SHOWNORMAL);

hWin := FindWindowExA(hWin, 0, PChar(‘SysTreeView32’), nil);

SetForegroundWindow(hWin);

i := 30;

repeat

SendMessageA(hWin, WM_KEYDOWN, VK_LEFT, 0);

Dec(i);

until i = 0;

Sleep(500);

SendMessageA(hWin, WM_KEYDOWN, VK_RIGHT, 0);

Sleep(500);

i := 1;

n := Length(Key);

repeat

if Key[i] = ‘\’ then

begin

SendMessageA(hWin, WM_KEYDOWN, VK_RIGHT, 0);

Sleep(500);

end

else

SendMessageA(hWin, WM_CHAR, Integer(Key[i]), 0);

i := i 1;

until i = n;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

JumpToKey(‘HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer’);

end;

end.

{/codecitation}

Отключить редактор системного реестра

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

— Дорогой, ты кого больше любишь?! Меня или эту дурацкую штуку, за которой ты проводишь целый день?!

— Ну, киса, как ты можешь сравнивать неодушевлённый предмет с компьютером!

Например мы вынесли компонент класса TCheckBox, назвали его «Использовать редактор системного реестра». Задача такова: когда флажок установлен пользователь может воспользоваться редактором реестра, когда не установлен — соответственно, не может!!!

Что нужно для осуществления этой задачи? Нужно воспользоваться ключом

HKEY_CURRENT_USER\Software\Microsoft\ Windows\CurrentVersion\Policies\System

создать в нём параметр:

DisableRegistryTools

и задать ему в качестве значение 1, т.е. задействовать его.

Код пишем по нажатию на самом Checkbox’e:

procedure TForm1.CheckBox1Click(Sender: TObject);

var

H: TRegistry;

begin

H := TRegistry.Create;

with H do

begin

RootKey := HKEY_CURRENT_USER;

OpenKey(‘\Software\Microsoft\Windows\CurrentVersion\Policies\System’, true);

if CheckBox1.Checked then

WriteInteger(‘DisableRegistryTools’, 0)

else

WriteInteger(‘DisableRegistryTools’, 1);

CloseKey;

Free;

end;

end;

Не забудьте в области uses объявить модуль Registry:

uses

Registry;

{/codecitation}

Объекты и TRegistry

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Кто-нибудь знает, как сохранить общие настройки шрифтов моей формы/пенели/списка и пр. пр. в регистрах; конечно, можно легко обойтись построчным сохранением, но, к примеру, в случае сохранения свойств шрифтов количество строк выйдет за пределы разумного — кто нибудь может подсказать мне решение покороче и полегче?

Delphi имеет маленький секрет, позволяющий рекурсивно сохранять в регистрах любые публичные свойства объектов. В качестве примера покажем как это работает для TFont.

uses TypInfo;

{ Определяем тип-набор для доступа к битам целого. }

const

BitsPerByte = 8;

type

TIntegerSet = set of 0..SizeOf(Integer) * BitsPerByte — 1;

{ Сохраняем набор свойств в виде подключа. Каждый элемент перечислимого типа —

отдельная логическая величина. Истина означает что элемент включен в набор,

Ложь — элемент в наборе отсутствует. Это позволит пользователю

с помощью редактора ресурсов (REGEDIT) легко изменять конфигурацию. }

procedure SaveSetToRegistry(const Name: string; Value: Integer;

TypeInfo: PTypeInfo; Reg: TRegistry);

var

OldKey: string;

I: Integer;

begin

TypeInfo := GetTypeData(TypeInfo)^.CompType;

OldKey := ‘\’ Reg.CurrentPath;

if not Reg.OpenKey(Name, True) then

raise ERegistryException.CreateFmt(‘Не могу создать ключ: %s’,

[Name]);

{ Организуем цикл для всех элементов перечислимого типа. }

with GetTypeData(TypeInfo)^ do

for I := MinValue to MaxValue do

{ Записываем логическую величину для каждого установленного элемента. }

Reg.WriteBool(GetEnumName(TypeInfo, I), I in

TIntegerSet(Value));

{ Возвращаем родительский ключ. }

Reg.OpenKey(OldKey, False);

end;

{ Сохраняем объект в регистрах в отдельном подключе. }

procedure SaveObjToRegistry(const Name: string; Obj: TPersistent;

Reg: TRegistry);

var

OldKey: string;

begin

OldKey := ‘\’ Reg.CurrentPath;

{ Открываем подключ для объекта. }

if not Reg.OpenKey(Name, True) then

raise ERegistryException.CreateFmt(‘Не могу создать ключ: %s’,

[Name]);

{ Сохраняем свойства объекта. }

SaveToRegistry(Obj, Reg);

{ Возвращаем родительский ключ. }

Reg.OpenKey(OldKey, False);

end;

{ Сохраняем в регистрах метод путем записи его имени. }

procedure SaveMethodToRegistry(const Name: string; const Method:

TMethod;

Reg: TRegistry);

var

MethodName: string;

begin

{ Если указатель на метод содержит nil, сохраняем пустую строку. }

if Method.Code = nil then

MethodName := »

else

{ Находим имя метода. }

MethodName := TObject(Method.Data).MethodName(Method.Code);

Reg.WriteString(Name, MethodName);

end;

{ Сохраняем в регистре каждое свойство в виде значения текущего

ключа. }

procedure SavePropToRegistry(Obj: TPersistent; PropInfo: PPropInfo;

Reg: TRegistry);

begin

with PropInfo^ do

case PropType^.Kind of

tkInteger,

tkChar,

tkWChar:

{ Сохраняем порядковые свойства в виде целочисленного значения. }

Reg.WriteInteger(Name, GetOrdProp(Obj, PropInfo));

tkEnumeration:

{ Сохраняем имена перечислимых величин. }

Reg.WriteString(Name, GetEnumName(PropType, GetOrdProp(Obj,

PropInfo)));

tkFloat:

{ Сохраняем реальные числа как Doubles. }

Reg.WriteFloat(Name, GetFloatProp(Obj, PropInfo));

tkString,

tkLString:

{ Сохраняем строки как строки. }

Reg.WriteString(Name, GetStrProp(Obj, PropInfo));

tkVariant:

{ Сохраняем вариантные величины как строки. }

Reg.WriteString(Name, GetVariantProp(Obj, PropInfo));

tkSet:

{ Сохраняем набор как подключ. }

SaveSetToRegistry(Name, GetOrdProp(Obj, PropInfo), PropType,

Reg);

tkClass:

{ Сохраняем класс как подключ, а его свойства

в виде значений подключа. }

SaveObjToRegistry(Name, TPersistent(GetOrdProp(Obj, PropInfo)),

Reg);

tkMethod:

{ Сохраняем в регистрах метод путем записи его имени. }

SaveMethodToRegistry(Name, GetMethodProp(Obj, PropInfo), Reg);

end;

end;

{ Записываем объект в регистр, сохраняя опубликованные свойства. }

procedure SaveToRegistry(Obj: TPersistent; Reg: TRegistry);

var

PropList: PPropList;

PropCount: Integer;

I: Integer;

begin

{ Получаем список опубликованных свойств. }

PropCount := GetTypeData(Obj.ClassInfo)^.PropCount;

GetMem(PropList, PropCount * SizeOf(PPropInfo));

try

GetPropInfos(Obj.ClassInfo, PropList);

{ Сохраняем каждое свойство в виде значения текущего ключа. }

for I := 0 to PropCount — 1 do

SavePropToRegistry(Obj, PropList^[I], Reg);

finally

FreeMem(PropList, PropCount * SizeOf(PPropInfo));

end;

end;

{ Сохраняем опубликованные свойства в виде значения данного ключа.

Корневой улей — HKEY_CURRENT_USER. }

procedure SaveToKey(Obj: TPersistent; const KeyPath: string);

var

Reg: TRegistry;

begin

Reg := TRegistry.Create;

try

if not Reg.OpenKey(KeyPath, True) then

raise ERegistryException.CreateFmt(‘Не могу создать ключ: %s’,

[KeyPath]);

SaveToRegistry(Obj, Reg);

finally

Reg.Free;

end;

end;

{/codecitation}