Rejestr

0

Dzień dobry, ostatnio trochę się głowiłem jak zapisać do rejestru wartość binarną,
czyli taką która w nie wiem dlaczego nazywa się binarną a jest zapisywana jak
hexodecymalna. No i wymyśliłem. :) Oczywiście pewnie jest to lipne rozwiązanie,
więc proszę o wszelkie sugestie i poprawki:
var
Rej : TRegistry;
Buf: Array [0..1024] of Char;
HexText: String;
begin
HexText := '7ddf05e3';
HexToBin(PChar(HexText), Buf, Length(HexText) div 2);
Rej:=TRegistry.Create;
Rej.RootKey:=HKEY_CURRENT_USER;
Rej.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
Rej.WriteBinaryData('Dupa', Buf, Length(HexText) div 2);
Rej.CloseKey;
Rej.Free;
end;
No ale teraz najważniejsze:
Odczytanie z rejestru takiej wartości powinno wyglądać analogicznie,
ale niestety mi to nie wychodzi, czy mógł by ktoś poratować przykładem?--__________________________________
Pozdrawiam...
piechnat

0

Piechnat, jakos to strasznie dookola zrobiles. Chyba sie za bardzo przejales slowem 'binary'. Write/Read BinaryData sluzy po prostu do zapisywania dowolnych danuch dowolnej dlugosci (w rozsadnych granicach). No a RegEdit wyswietla to jako hex, no bo jakos musi.

Ja bym robil tak:

dla wartosci 4-bajtowej - takiej jak u Ciebie uzylbym po prostu Cardinal

procedure TForm1.Button1Click(Sender: TObject); *zapis
var
Rej : TRegistry;
Value: Cardinal;
begin
Value :=$7ddf05e3;
Rej:=TRegistry.Create;
Rej.RootKey:=HKEY_CURRENT_USER;
Rej.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
Rej.WriteBinaryData('Dupa', Value, SizeOf(Value));
Rej.CloseKey;
Rej.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Rej : TRegistry;
Value: Cardinal;
begin
Rej:=TRegistry.Create;
Rej.RootKey:=HKEY_CURRENT_USER;
Rej.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
Rej.ReadBinaryData('Dupa', Value, SizeOf(Value));
Rej.CloseKey;
Rej.Free;
Edit1.Text:=IntToHex(Value,8); * 8 cyfr szesnastkowych
end;

Do 8 bajtow mozna uzyc Int64. Powyzej trzeba uzyc wiekszych struktur danych, np lancuchow (krotkich lub dlugich), rekordow (uwaga na packed) lub tablic statycznych lub dynamicznych

Przyklad z tablica dynamiczna:

procedure TForm1.Button1Click(Sender: TObject); *zapis
var
Rej : TRegistry;
Value: array of byte;
begin
SetLength(Value, 10);
Value[0]:=$7d; *oczywiscie w normalnym programie te wartosci beda zapewne
*wpisane skads w bardziej sensowny sposob
Value[1]:=$df;
Value[2]:=$05;
Value[3]:=$e3;
Value[4]:=$aa;
Value[5]:=$bb;
Value[6]:=$cc;
Value[7]:=$dd;
Value[8]:=$ee;
Value[9]:=$ff;

Rej:=TRegistry.Create;
Rej.RootKey:=HKEY_CURRENT_USER;
Rej.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
Rej.WriteBinaryData('Dupa', Value[0], Length(Value));
{indeks 0 dla tablicy dynamicznej, 1 dla lancucha}
Rej.CloseKey;
Rej.Free;
end;

procedure TForm1.Button2Click(Sender: TObject); *odczyt
var
Rej : TRegistry;
Value: array of byte;
i: integer;
begin
SetLength(Value, 10);
Rej:=TRegistry.Create;
Rej.RootKey:=HKEY_CURRENT_USER;
Rej.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
Rej.ReadBinaryData('Dupa', Value[0], Length(Value));
Rej.CloseKey;
Rej.Free;
for i:=0 to 9 do
Edit1.Text:=Edit1.Text+IntToHex(Value[i],2); // 2 cyfry szesnastkowe na bajt
end;

Oba przyklady sprawdzilem dzialaja u mnie.

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Jej... {brawo}
Dziękuje za tak bardzo
wyczerpującą odpowiedź :)--__________________________________
Pozdrawiam...
piechnat

1 użytkowników online, w tym zalogowanych: 0, gości: 1