Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 2. - Automatické spuštění aplikace; Schování aplikace ze seznamu běžících procesů (po stisku CTRL-ALT-DELETE); Zjištění základních informací o BIOSu

Jan Šindelář - 1.8.2001

Automatické spuštění aplikace

Určitě víte, že v menu Start se nachází složka "Po spuštění".Cokoliv sem umístíte (aplikaci či dokument), bude po startu systému spuštěno. Je to pro uživatele jistě rychlá a pohodlná cesta, jak svůj systém přizpůsobit svým požadavkům. Avšak z hlediska programátora není tento způsob příliš elegantní a profesionální, neboť méně zkušený uživatel může snadno tyto položky z menu Start omylem smazat. Představte si pak situaci, že by se tímto způsobem spouštěl kupříkladu rezidentní štít antivirového programu. V tom případě by se stal počítač nechráněným a nezkušený uživatel by to ani nemusel vědět. Jaké je tedy řešení? Jak jinak, pomůže nám registr Windows.

Nejprve je nutné se rozhodnout, zda budeme chtít aplikaci spouštět vždy se startem systému (tzn. pro všechny uživatele), a nebo pouze pro toho uživatele, který je aktuálně přihlášen. Zdrojový kód procedury bude pro obě možnosti totožný, lišit se bude pouze větev registrů, kde se záznam provede.

Konkrétně se tedy jedná o větve:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

(pro aktuálního uživatele)

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

(pro všechny uživatele).

Samotný záznam se skládá ze dvou částí – názvu a hodnoty. Název si můžete zvolit zcela libovolný, hodnota je textový řetězec, který obsahuje cestu ke spouštěné aplikaci včetně případných parametrů.

Nyní si tedy napíšeme jednoduchou proceduru, která nám zajistí spuštění Kalkulačky po startu Windows:

.
.
uses Registry;
.
.

procedure PridejZaznamDoRegistru;
var key: string;
    Reg: TRegIniFile;
begin
key:=`\Software\Microsoft\Windows\CurrentVersion\Run`;
Reg:=TRegIniFile.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.CreateKey(Key);
if Reg.OpenKey(Key,False) then Reg.WriteString(key,`Kalkulacka`,`c:\Windows\Calc.exe`);
finally
Reg.Free;
end;
end;

Snadno můžete proceduru upravit změnou klíče na HKEY_CURRENT_USER a samozřejmě změnit též spouštěnou aplikaci.

Důležité je ovšem nejen umět záznam do registru přidat, ale musíme též vědět, jak záznam odstranit, a vždy po sobě registr při případné odinstalaci aplikace „vyčistit“ (škoda, že se tím svědomitě neřídí také profesionální odinstalátory a registry zůstávají přeplněny zbytečným a nepotřebným „balastem“). K odstranění záznamu slouží následující procedura:

.
.
uses Registry;
.
.

procedure OdstranZaznamZRegistru;
var key: string;
    Reg: TRegIniFile;
begin
key:=`\Software\Microsoft\Windows\CurrentVersion\Run`;
Reg:=TRegIniFile.Create;
try
Reg.RootKey:=HKey_Local_Machine;
if Reg.OpenKey(Key,False) then Reg.DeleteValue(`Kalkulacka`);
finally
Reg.Free;
end;
end;

Obě tyto funkce berte samozřejmě jako pouhý zjednodušený příklad. Vylepšit je a doplnit např. o parametry (výběr větve registru, soubor, případně kontrola bezchybného zápisu), aby byly univerzálnější, jistě zvládnete již sami.

Nakonec se seznámíme ještě s jednou větví registrů. Pokud nahradíme Run za RunOnce :

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce

případně

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce

dosáhneme toho, že program bude spuštěn pouze jednou a poté se záznam z registrů sám odstraní, takže při příštím restartu se již nespustí. Toho často využívají například instalační programy k "úklidu" těch částí aplikací, které byly během odinstalačního procesu aktivní a nemohly být smazány, či naopak k dokončení instalace po restartu počítače.

Schování aplikace ze seznamu běžících procesů (po stisku CTRL-ALT-DELETE)

Využití této funkce ponechám čistě na vaší fantazii. Z hlediska určité "průhlednosti" systému by měla být správně každá aplikace po stisku CTRL-ALT-DEL vidět na seznamu běžících procesů např. kvůli potřebě "násilného" ukončení. O praktické funkčnosti tohoto ukončování ve Windows 9x se radši příliš bavit nebudeme, někdy to prostě jde a jindy zase ne. Jsou ovšem i druhy aplikací, kde by jejich násilné ukončení (ať už neznalým nebo naopak až příliš znalým uživatelem) nemuselo být právě dobré (různé "bezpečnostní" systémy, antiviry apod.), a proto je lepší, když vidět nejsou. Proto si teď ukážeme, jak na to. Ve všem nám pomůže jedna z funkcí systémové knihovny Kernel32.dll.

Nejprve přidáme do našeho zdrojového kódu deklaraci externí funkce RegisterServiceProcess.

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external `KERNEL32.DLL`;

A nyní již samotné schování a opětovné odkrytí naší aplikace:

procedure Schovej;
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure Ukaz;
begin
RegisterServiceProcess(GetCurrentProcessID, 0);
end;

Nepříjemná zpráva zní, že tento postup bohužel nefunguje pod Windows 2000 (a tím pádem pravděpodobně i pod Windows NT), i když to se dalo asi očekávat.

Zjištění základních informací o BIOSu

Naučíme se zjistit pár základních dat, jako je jméno BIOSu, copyright (výrobce), datum a výrobní číslo.

Samozřejmě nelze zaručit naprostou univerzálnost a funkčnost na všech deskách a typech BIOSů (příklad byl testován na čipsetu i440BX s Award BIOSem), ale pokud není vaše deska příliš exotická, fungovat by to mělo.

Využití ponechávám opět na vaší fantazii. Můžete si třeba takto vytvořit zjednodušenou ochranu svých shareware aplikací (zdravíme Microsoft a Windows XP). :)

Stejně jako předchozí příklad ani tento vám bohužel nebude fungovat pod Windows 2000.

function BIOS(var jmeno,copyright,datum,serial:string):boolean;
begin
try
jmeno:= String(Pchar(Ptr($FE061)));
copyright := String(Pchar(Ptr($FE091)));
datum := String(Pchar(Ptr($FFFF5)));
serial := String(Pchar(Ptr($FEC71)));
Result:=true;
except
jmeno:=`Nezjištěno`;
copyright:=`Nezjištěno`;
datum :=`Nezjištěno`;
serial :=`Nezjištěno`;
Result:=false;
end;
end;

Co bude příště ?

V příštím díle našeho seriálu si ukážeme, jak ovládat CD mechaniku, pohrajeme si s monitorem a naučíme se aktivovat šetřič obrazovky.