![]() |
Kann keinen neuen Registryeintrag erstellen (access violation)
moin allerseits,
ich möchte einen DWORD-Wert in "Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows\CurrentVersion\Policies\System" erstellen, ich habe lange gegoogelt, bin noch noch ziemlich neu dabei in sachen delphi programmierung. die meldungen sind: erster versuch: im projekt project1.exe ist eine exeption der klasse eregistryexception mit der meldung 'fehler beim setzen der daten für 'Wertname'' aufgetreten. (die zeile mit "reg.CloseKey;" ist markiert) zweiter versuch: im projekt project1.exe ist eine exeption der klasse $C0000005 mit der meldung 'access violation at 0x004eaf03:read of address 0x0000001d' aufgetreten. (die zeile mit "Registry.WriteString('Schlüssel', 'Wert');" ist markiert)
Code:
ich hab tagelang nach einer lösung gesucht aber ohne erfolg, hoffentlich hat von euch jemand eine idee :(
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, mmsystem, Vcl.MPlayer, Registry, Vcl.StdCtrls, Tlhelp32, ShellApi; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private //nix public //nix end; var Form1: TForm1; Vet : Array[0..3] of Byte = (01,00,00,00); implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var Registry,reg: TRegistry; FProcessEntry32: TProcessEntry32; begin //erster versuch reg := TRegistry.Create(KEY_ALL_ACCESS); try try reg.Lazywrite := false; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System', false); reg.WriteBinaryData('Wertname',Vet,SizeOf(Vet)); reg.CloseKey; except on E:Exception do begin ShowMessage(E.Message); end; end; finally reg.CloseKey; end; //zweiter versuch //nur zum testen ob string und integer denn funktionieren würden with TRegistry.Create do begin Rootkey:=HKEY_CURRENT_USER; //Hauptschlüssel try Registry.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',true);//bei true wird Schlüssel erzeugt, wenn er noch nicht existiert Registry.WriteString('Schlüssel', 'Wert'); Registry.WriteInteger('Zahl',123); finally Registry.free; end; end; end; end. |
AW: Kann keinen neuen Registryeintrag erstellen (access violation)
Willkommen in der DP.
Als aller erstes: Copy und Paste ist echt mies. Wenn man das schon macht, dann sollte man sich den Code wenigstens angucken und verstehen. Ein DWord ist ein Integer. Also
Delphi-Quellcode:
var
r: TRegistry; begin r := TRegistry.Create; try r.RootKey := HKEY_LOCAL_MACHINE; r.OpenKey('SOFTWARE\1DWordTest', True); r.WriteInteger('DWordTest', 1); finally r.Free; end; end; |
AW: Kann keinen neuen Registryeintrag erstellen (access violation)
Delphi-Quellcode:
Registry wird nie ein Wert zugewiesen, damit fehlt irgendwie das Registry := TRegisty.Create und es kann auch nicht darauf zugegriffen werden.
//zweiter versuch
//nur zum testen ob string und integer denn funktionieren würden with TRegistry.Create do begin Rootkey:=HKEY_CURRENT_USER; //Hauptschlüssel try Registry.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',true);//bei true wird Schlüssel erzeugt, wenn er noch nicht existiert Registry.WriteString('Schlüssel', 'Wert'); Registry.WriteInteger('Zahl',123); finally Registry.free; end; end; end; Wenn schon was mit with TRegistry.Create, dann eventuell so?
Delphi-Quellcode:
//zweiter versuch
//nur zum testen ob string und integer denn funktionieren würden with TRegistry.Create do begin Rootkey:=HKEY_CURRENT_USER; //Hauptschlüssel try OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',true);//bei true wird Schlüssel erzeugt, wenn er noch nicht existiert WriteString('Schlüssel', 'Wert'); WriteInteger('Zahl',123); finally free; end; end; end; |
AW: Kann keinen neuen Registryeintrag erstellen (access violation)
Noch ein anderer Punkt, nachdem die offensichtlichen Dinge (AV, korrekte Verwendung der Datentypen) nun (hoffentlich) gelöst sind: Im Policies-Schlüssel der Registry dürfen ausschließlich Administratoren schreiben, auch wenn da HKCU als Rootkey angegeben ist! Anders herum formuliert: ein Nutzer darf in HKCU machen, was er will, da es ja sein eigener Zweig der Registry ist - mit Ausnahme der Policies; möglicherweise gibt's noch andere Schlüssel, aber das dürfte der prominenteste sein.
Ich lasse mal Änderungen der Zugriffsrechte an diesem Schlüssel absichtlich unter den Tisch fallen, weil das in der Praxis keine Rolle spielt. Es hat ja seinen Grund, warum es Policies sind: die Nutzer sollen daran gehindert werden, an den Vorgaben der Administratoren (zumeist Gruppenrichtlinien) rumzuspielen. Ich empfehle daher, das zu bedenken. Übrigens ist es immer eine gute Idee, die Rückgabewerte von Funktionen zu prüfen. Es ist besser
Delphi-Quellcode:
zu schreiben, als einfach davon auszugehen, dass die Funktion (hier OpenKey) schon erfolgreich gewesen sein wird.
if OpenKey(...) then begin
WriteInteger(...); end; Grüße Dalai |
AW: Kann keinen neuen Registryeintrag erstellen (access violation)
Zitat:
Aber das merkt man, wenn man den Debugger richtiger verwendet. z.B. Haltepunkt davor und dann mit F7/F8 zeilenweise weiter ... da merkt man genau bei welchem Befehl es wirklich knallt. Gut, die Fehlermeldung an sich hatte auch einen Hinweis darauf gegeben, dass es wohl eher beim Write (Setzen) knallt. Problemchem mit dem nachfolgenden Befehl, wenn vorher z.B. ein IF kommt und man erstmal nicht weiß aus welcher Richtung das Programm kam. |
AW: Kann keinen neuen Registryeintrag erstellen (access violation)
Hallo,
hier bietet es sich auch an, auf Compiler-Warnungen zu hören. Das erste registry. muss doch die Warnung "Variable nicht initialisiert" gebracht haben? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz