Entwickler-Ecke

Dateizugriff - Zugriffverletzung in Registry


Sliver - Do 10.07.03 16:43
Titel: Zugriffverletzung in Registry

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure dlldel;
var
  i: Integer;
  Reg: TRegistry;
  Values: TStringlist;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs', False) then begin
      Reg.GetValueNames(Values);  //hier ist die Zugriffsverletzung
      for i := 0 to Values.Count - 1 do
        if Reg.ReadInteger(Values[i]) = 0 then
          Reg.DeleteValue(values[i]);
    end;
  finally
    Values.Free;
    Reg.Free;
  end;  
end;


Wenn ich die Werte des Schlüssels der Variable "Values" übergebe gibt es eine Zugriffsverletzung. Ich habe WIn2k und bin als Admin angemeldet.

cu Sliver


derDoc - Do 10.07.03 17:08

Versuch mal die StringList erst zu erstellen, bevor du etwas hinein schreibst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure dlldel;
var
  i: Integer;
  Reg: TRegistry;
  Values: TStringlist;
begin
  Values := TStringList.Create;  //Erstellen der StringList
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE; 
    if Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs', False) then begin
      Reg.GetValueNames(Values);  //hier ist die Zugriffsverletzung
      for i := 0 to Values.Count - 1 do
        if Reg.ReadInteger(Values[i]) = 0 then
          Reg.DeleteValue(values[i]);
    end;
  finally
    Values.Free;
    Reg.Free; 
  end;   
end;


Sliver - Do 10.07.03 17:20

Ok, Danke das funtz.


Delphi-Quelltext
1:
if Reg.ReadInteger(Values[i]) = 0 then                    


Ich habe jetzt das Problem das nicht alle "Values" DWORD Einträge sind, sondern auch SZ also String. Wenn ich den Wert (Integer) auslesen will und es ist kein DWORD Eintrag dann gibt es einen Fehler, was ja klar ist. Aber wie kann ich das umgehen?


Delete - Do 10.07.03 19:25

TRegistry.GetDataInfo.


Sliver - Do 10.07.03 20:21


Delphi-Quelltext
1:
if Reg.GetDataInfo(values[i], rdInteger) then                    

Fehler: Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

Was ist hier falsch?


Delete - Do 10.07.03 20:32

Puh. Mal so aus dem Stegreif:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  DataType: TRegDataType;
begin
  ...;
  Reg.GetDataInfo(values[i], DataType);
  if DataType = rdInterger then
     ...;


Sliver - Do 10.07.03 20:35


Delphi-Quelltext
1:
Reg.GetDataInfo(values[i], DataType);                    


Genau der gleiche Fehler.


Delete - Do 10.07.03 22:05

Sag mal, Sliver, hast du irgendeine Sonderversion von Delphi? Bei mir ist eine Hilfe (F1) dabei. Da steht die Funktionsdeklaration drin. Auch, von welchem Typ der zweite Parameter sein muss. Mauszeiger drauf auf den Begriff "GetDataInfo". Einmal klicken, dann F1 gedrückt ... und kurz lesen. - So faul kann doch keiner sein. :evil:

Aber Luckie meinte wahrscheinlich ohnehin GetDataType.


Sliver - Do 10.07.03 22:26

Warst du zu faul um das ganze Topic durchzulesen na, also ich war nicht zu faul um in der Hilfe nach zu schauen, aber mit GetDataType konnte ich es bewerkstelligen Danke, war ja eigentlich grad in der Hilfe unter dem GetDataInfo. Aber egal.

cu SLiver