Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kann keinen neuen Registryeintrag erstellen (access violation) (https://www.delphipraxis.net/191240-kann-keinen-neuen-registryeintrag-erstellen-access-violation.html)

idontknowagoodnameforthis 22. Dez 2016 22:53

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:
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.
ich hab tagelang nach einer lösung gesucht aber ohne erfolg, hoffentlich hat von euch jemand eine idee :(

a.def 22. Dez 2016 23:21

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;

nahpets 22. Dez 2016 23:43

AW: Kann keinen neuen Registryeintrag erstellen (access violation)
 
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
        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;
Registry wird nie ein Wert zugewiesen, damit fehlt irgendwie das Registry := TRegisty.Create und es kann auch nicht darauf zugegriffen werden.

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;

Dalai 23. Dez 2016 01:01

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:
if OpenKey(...) then begin
    WriteInteger(...);
end;
zu schreiben, als einfach davon auszugehen, dass die Funktion (hier OpenKey) schon erfolgreich gewesen sein wird.

Grüße
Dalai

himitsu 23. Dez 2016 04:17

AW: Kann keinen neuen Registryeintrag erstellen (access violation)
 
Zitat:

die zeile mit "reg.CloseKey;" ist markiert
Der Debugger markiert gern mal den nachfolgenden Befehl.
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.

hoika 23. Dez 2016 06:57

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 19:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz