hallo ich hab mir ein Function zusammengebaut
sie funktiniert auch soweit nur bei multisz bin ein bischen unsicher
zwar lese ich nur bin, dw, sz und multi aus aber ganz wohl bin ich bei der sache nicht
ich habe den multi jetzt bei unbekannt eingesetzt
aber das ist zu unsicher
kann mir jemand sagen wie ich das besser machen kann ?
//Type (öffentlich)
type
reg1_r = Record
s1 : HKEY;
s2 : String;
s3 : String;
end;
Code:
//******************************************************************************
//ÜbergabeFunction
//Wert Reg aus der Registry lesen
Function Reg_Lesen_RYU(input_r : reg1_r) : reg_wert_r;
const bufsize = 100;
var
Reg : TRegistry;
output_s : String;
string_s : String;
integer_i : Integer;
byte_buffer_dab : Array of Byte;
byte_ausgabe_s : String;
byte_size_i : integer;
byte_len_i : Integer;
i : Integer;
multi_type_c: Cardinal;
multi_size_c: Cardinal;
multi_str_s: String;
begin
Reg := TRegistry.Create;
output_s := '';
string_s := '';
try
//HKEY lesen
Reg.RootKey := input_r.s1;
//Schlüssel lesen
if not Reg.OpenKey(input_r.s2, False) then
begin
//Kein Schlüssel vorhanden
output_s := 'nokey';
Result.s1 := output_s;
Result.s2 := '';
end
else
begin
//Wert lesen
if Reg.ValueExists(input_r.s3) = False then
begin
//Kein Wert vorhanden
output_s := 'novalue';
Result.s1 := output_s;
Result.s2 := '';
end
else
begin
//String
if (Reg.GetDataType(input_r.s3) = rdString) then
begin
string_s := Reg.readstring(input_r.s3);
Result.s1 := 'sz';
Result.s2 := string_s;
end
//Integer
else if (Reg.GetDataType(input_r.s3) = rdInteger) then
begin
integer_i := Reg.readinteger(input_r.s3);
Result.s1 := 'dw';
Result.s2 := IntToStr(integer_i);
end
//Binary
else if (Reg.GetDataType(input_r.s3) = rdBinary) then
begin
SetLength(byte_buffer_dab, byte_size_i);
byte_len_i := Reg.ReadBinaryData(input_r.s3, PChar(byte_buffer_dab)^, byte_size_i);
byte_ausgabe_s := '';
for i := 0 to byte_len_i - 1 do
begin
if Length(IntToStr(byte_buffer_dab[i])) = 1 then
begin
byte_ausgabe_s := byte_ausgabe_s + '0' + IntToStr(byte_buffer_dab[i]);
end
else
begin
byte_ausgabe_s := byte_ausgabe_s + IntToStr(byte_buffer_dab[i]);
end;
end;
Result.s1 := 'bi';
Result.s2 := byte_ausgabe_s;
end
//Erweiterter String
else if (Reg.GetDataType(input_r.s3) = rdExpandString) then
begin
string_s := Reg.readstring(input_r.s3);
Result.s1 := 'es';
Result.s2 := string_s;
end
//Mehrzeiliger String
else if (Reg.GetDataType(input_r.s3) = rdUnknown) then
begin
multi_size_c := 0;
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, nil, @multi_size_c);
SetLength(multi_str_s, multi_size_c - 1);
if multi_size_c > 1 then
begin
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, PByte(multi_str_s), @multi_size_c);
end;
for i := Length(multi_str_s) downto 1 do
begin
if multi_str_s[i] = #0 then
begin
multi_str_s[i] := #13;
end;
end;
if (multi_str_s <> '') then
begin
Result.s1 := 'mz';
Result.s2 := multi_str_s;
end;
end
//Fehler
else
begin
//Fehler kein Typ gefunden
end;
end;
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
der teil um den es mir geht ist der hier
//Mehrzeiliger String
else if (Reg.GetDataType(input_r.s3) = rdUnknown) then
begin
multi_size_c := 0;
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, nil, @multi_size_c);
SetLength(multi_str_s, multi_size_c - 1);
if multi_size_c > 1 then
begin
RegQueryValueEx(Reg.CurrentKey, PChar(input_r.s3), nil, @multi_type_c, PByte(multi_str_s), @multi_size_c);
end;
for i := Length(multi_str_s) downto 1 do
begin
if multi_str_s[i] = #0 then
begin
multi_str_s[i] := #13;
end;
end;
if (multi_str_s <> '') then
begin
Result.s1 := 'mz';
Result.s2 := multi_str_s;
end;
end