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
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
Jej... {brawo}
Dziękuje za tak bardzo
wyczerpującą odpowiedź :)--__________________________________
Pozdrawiam...
piechnat