Da toms vom SwissDelphiCenter anwesend ist, hier mal eine Idee zur Diskussion, basierend auf diesem
Beitrag. Es bezieht sich zwar mehr auf den Beitrag, den Akut-Programming hervorgekramt hat, aber egal ...
Weil sich Hauptpfad ja nicht ändert (egal ob man in
HKCU oder
HKLM schreibt), habe ich diesen als globale Konstante abgelegt:
Delphi-Quellcode:
uses
Registry;
const
szWinKey = 'Software\Microsoft\Windows\CurrentVersion\';
Und hier nun die drei Funktionen. In allen lässt sich der Root, sowie der gewünschte Run-Schlüssel (Run, RunOnce) und natürlich der Name des Wertes festlegen. Die erste Funktion hat logischerweise noch einen vierten Parameter - für das Programm, das eingetragen werden soll:
Delphi-Quellcode:
function DoAppToRun(
const iRegRoot: HKEY;
szRunKey, szRunName, szAppName:
string): boolean;
var
reg : TRegistry;
begin
Result := false;
reg := TRegistry.Create;
if(reg <>
nil)
then
with reg
do
try
RootKey := iRegRoot;
if(OpenKey(szWinKey + szRunKey,true))
then
try
WriteString(szRunName,szAppName);
// "try/finally/end", weil "WriteString" eine
// Exception auslöst, wenn der Wert nicht
// geschrieben werden konnte (s. F1)
Result := ValueExists(szRunName);
finally
CloseKey;
end;
finally
Free;
end;
end;
function IsAppInRun(
const iRegRoot: HKEY;
szRunKey, szRunName:
string): boolean;
var
reg : TRegistry;
begin
Result := false;
reg := TRegistry.Create(KEY_READ);
// zum Auslesen kann man die Registry
// auch "nur lesend" öffnen
if(reg <>
nil)
then
with reg
do
try
RootKey := iRegRoot;
if(OpenKey(szWinKey + szRunKey,false))
then
try
Result := ValueExists(szRunName);
finally
CloseKey;
end;
finally
Free;
end;
end;
function DelAppFromRun(iRegRoot: HKEY;
const szRunKey, szRunName:
string): boolean;
var
reg : TRegistry;
begin
Result := false;
reg := TRegistry.Create;
if(reg <>
nil)
then
with reg
do
try
RootKey := iRegRoot;
if(OpenKey(szWinKey + szRunKey,false))
then
// s. Code vom SwissDelphiCenter; dort wird der
// Schlüssel mit "true" geöffnet - also notfalls
// angelegt.
// Wieso? Der Eintrag soll doch gelöscht werden,
// und das ist nur möglich, wenn auch der
// Schlüssel existiert. Also: "false" reicht.
try
if(ValueExists(szRunName))
then
Result := DeleteValue(szRunName);
finally
CloseKey;
end;
finally
Free;
end;
end;
Beispiele:
Delphi-Quellcode:
// Rein, ...
if(DoAppToRun(HKEY_CURRENT_USER,
'
Run',
'
MeMyselfAndI',
Format('
"%s"',[paramstr(0)])))
then
ShowMessage('
Wert eingetragen!');
// ... & raus
if(DelAppFromRun(HKEY_CURRENT_USER,
'
Run',
'
MeMyselfAndI'))
then
ShowMessage('
Wert entfernt');
// und für Besitzer der Kerio PFW unter Win9x
if(IsAppInRun(HKEY_LOCAL_MACHINE,
'
RunServices',
'
PersFw'))
then
ShowMessage('
Eintrag von Kerio PFW gefunden');
// oder als Demo für die Benutzerrechte
// (die Funktion "IsAdmin" von NicoDE sollte in
// der DP zu finden sein)
const
iRegRoots :
array[boolean]
of HKEY =
(HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE);
{ ... }
if(DoAppToRun(iRegRoots[IsAdmin],
'
Run',
'
MeMyselfAndI',
Format('
"%s"',[paramstr(0)])))
then
ShowMessage('
Wert eingetragen!');
// hat der User Admin-Rechte, landet der Eintrag
// in HKLM, ansonsten in HKCU
Gruß.