Discussion:
Delphi6 + Windows7 + Registry(Write) = Zugriffsverletzung
(zu alt für eine Antwort)
Trunks
2011-07-02 01:15:51 UTC
Permalink
Hallo Leute,

ich bin gerade am Schreiben eines kleinen Programmes, was
Anmeldebildschirme unter Windows 7 ändert, habe soweit beim
Programmstart die nötigen Rechte und die Win32Major abgefragt.. Nun
möchte ich die Registry prüfen und diese auch verwenden.. So gibt es
bei mir irgendwie Probleme..

Ich nutze Delphi 6, ich weiß ist eine sehr alte Version von der PC-
WELT, eine neuere Version hab ich nicht und finden tue ich die Delphi
2005 Personal auf anderen Seiten auch nicht mehr..

der einzigste Link fürt zu einem Toten Verweis
http://www.delphi-forum.de/download_delphi_2005_personal.html (404)

Adminrechte sind an der Stelle vorhanden.. Ja man könnte den Wert
prüfen, wenn ich das tue ReadInteger kommt bei mir Fehler beim Holen
der Daten, weil der Value nicht vorhnaden ist.. Deswegen versuche ich
zu schreiben aber hier kommen bereits fehler...


---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 00452A93 in Modul 'Project1.exe'.
Schreiben von Adresse 00429244.
---------------------------
OK
---------------------------

der Code für den Aufruf sieht so aus..

procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
var tmp: boolean;
var tmp2: String;
begin
reg.Lazywrite := false;
reg := TRegistry.Create(KEY_ALL_ACCESS);
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion
\Authentication\LogonUI\Background\', true);
try
reg.WriteInteger('OEMBackground',1);
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
end;

Verwendet wird Windows 7 Ultimate 64bit und Delphi 6 Personal (PC-
Welt).
Arno Garrels
2011-07-02 04:38:05 UTC
Permalink
Post by Trunks
Adminrechte sind an der Stelle vorhanden..
Das Schreiben in HKEY_LOCAL_MACHINE erfordert seit Vista
erhöhte Rechte, siehe Benutzerkontensteuerung (UAC):
http://msdn.microsoft.com/de-de/library/bb384608.aspx
--
Arno Garrels
Michael Justin
2011-07-02 05:22:26 UTC
Permalink
Post by Trunks
Zugriffsverletzung bei Adresse 00452A93 in Modul 'Project1.exe'.
...
Post by Trunks
der Code für den Aufruf sieht so aus..
...
Post by Trunks
var reg: TRegistry;
...
Post by Trunks
reg.Lazywrite := false;
reg := TRegistry.Create(KEY_ALL_ACCESS);
Zugriff auf das TRegistry Objekt vor seiner Erzeugung - die beiden
Zeilen müssen vertauscht werden:

reg := TRegistry.Create(KEY_ALL_ACCESS);
reg.Lazywrite := false;

try sollte dann unmittelbar nach der ersten Zeile stehen (Resource
erzeugen, dann try ... Resource benutzen ... except / finally).

Viele Grüße
--
Michael Justin
Trunks
2011-07-02 08:33:44 UTC
Permalink
Post by Michael Justin
Post by Trunks
Zugriffsverletzung bei Adresse 00452A93 in Modul 'Project1.exe'.
...
Post by Trunks
der Code für den Aufruf sieht so aus..
...
Post by Trunks
var reg: TRegistry;
...
Post by Trunks
   reg.Lazywrite := false;
   reg := TRegistry.Create(KEY_ALL_ACCESS);
Zugriff auf das TRegistry Objekt vor seiner Erzeugung - die beiden
     reg := TRegistry.Create(KEY_ALL_ACCESS);
     reg.Lazywrite := false;
try sollte dann unmittelbar nach der ersten Zeile stehen (Resource
erzeugen, dann try ... Resource benutzen ... except / finally).
Viele Grüße
--
Michael Justin
Danke Michael, für die Hilfe offenbar funktioniert es jetzt. Offenbar
weil ich selbst über regedit die Daten nicht sehe um ggf. den Wert zu
löchen, meine Debugmeldung die ich jetzt eingebaut habe wird sofort
beim ersten durchlauf betätigt, also ist nicht nur Temporrär bekannt.
Ich hab es auch schon mit einem anderen Integer-Wert versucht.. Meine
regedit-Fenster zeigt auch nach Neuladen nur den (Standart):REG_SZ-
Wert an.

Mein Code mit try-finally sieht nun so aus.. ich hab die Exception auf
alles gelegt weil sonst hätte ich jetzt mehrfach es machen müssen
ReadInteger und WriteInteger usw..

procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
var tmp: boolean;
var tmp2: String;
begin
reg := TRegistry.Create(KEY_ALL_ACCESS);
try
try
reg.Lazywrite := false;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion
\Authentication\LogonUI\Background\', true);
if(reg.ReadInteger('OEMBackground')=1) then showmessage('DEBUG:
REGISTRY OK') else reg.WriteInteger('OEMBackground',1);
reg.CloseKey;
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
finally
reg.CloseKey;
end;
end;

Werde nacher mal schauen ob Microsoft auch den Wert erkennt.

Viele Grüße
David Losse
Trunks
2011-07-02 08:57:50 UTC
Permalink
  finally
    reg.CloseKey;
  end;
Sehe gerade selbst ein fehler.. reg.free; muss hin an der stelle...
Loading...