AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kann keinen neuen Registryeintrag erstellen (access violation)
Thema durchsuchen
Ansicht
Themen-Optionen

Kann keinen neuen Registryeintrag erstellen (access violation)

Offene Frage von "hoika"
Ein Thema von idontknowagoodnameforthis · begonnen am 22. Dez 2016 · letzter Beitrag vom 23. Dez 2016
Antwort Antwort
idontknowagoodnameforthis

Registriert seit: 22. Dez 2016
1 Beiträge
 
#1

Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 22. Dez 2016, 22:53
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
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#2

AW: Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 22. Dez 2016, 23:21
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;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 22. Dez 2016, 23:43
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;
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#4

AW: Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 23. Dez 2016, 01:01
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#5

AW: Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 23. Dez 2016, 04:17
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Dez 2016 um 04:21 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Kann keinen neuen Registryeintrag erstellen (access violation)

  Alt 23. Dez 2016, 06:57
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?
Heiko

Geändert von hoika (23. Dez 2016 um 07:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 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