Ich habe eine Klasse TProfileWriter zum Massenschreiben von Registryeinträgen.
Delphi-Quellcode:
TProfileWriter = class
private
Reg: TRegistry;
Keys: TStringList;
procedure FindKeys;
public
constructor Create;
destructor Destroy; override;
procedure WriteBinaryValue(const Name: string; var Value: array of byte);
procedure WriteProfile(const Profile: TProfile);
end;
Delphi-Quellcode:
procedure TProfileWriter.WriteBinaryValue(const Name: string; var Value: array of byte);
var
i: cardinal;
begin
if (Keys.Count > 0) and (Length(Value) > 0) then
for i := 0 to Keys.Count - 1 do begin
Reg.OpenKey(Keys.Strings[i], false);
Reg.WriteBinaryData(Name,Value[0],Length(Value));
Reg.CloseKey;
end;
end;
procedure TProfileWriter.WriteProfile(const Profile: TProfile);
var
pc: PAnsiChar;
a: array of byte;
i: cardinal;
begin
SetLength(a, 4);
GetMem(pc, 5);
try
FillChar(pc,5,0);
with Profile.Settings do
begin
if Count > 0 then for i := 0 to Count - 1 do
begin
pc := PChar(LowerCase(ValueFromIndex[i]));
HexToBin(pc,pc,4);
CopyMemory(@a[0],pc,4);
WriteBinaryValue(Names[i],a);
end;
end;
finally
FreeMem(pc);
end;
end;
Wenn ich jetzt in einem ActionExecute-Event des Hauptforumulars WriteProfile mit einem Profil (ebenfalls eine Klasse mit einer Stringlist "Settings") aufrufe, kommt es in folgender Zeile zu einer
Exception:
if (Keys.Count > 0) and (Length(Value) > 0) then
Zitat:
Im Projekt DNAProfChanger.exe ist eine
Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0047122B in Modul 'DNAProfChanger.exe'. Lesen von Adresse 00000000' aufgetreten.
gefolgt von einer "Ungültigen Zeigeroperation".
Wenn ich WriteBinaryValue im OnCreate des Hauptformulars zum Test so aufrufe, tritt die
Exception nicht auf und die Registryeinträge werden korrekt geschrieben.
Anscheinend ist Keys = nil beim Aufruf aus WriteProfile, aber das dürfte doch gar nicht sein!?