Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi BinToHex und TRegistry.ReadBinaryData (https://www.delphipraxis.net/118097-bintohex-und-tregistry-readbinarydata.html)

Aurelius 31. Jul 2008 13:40


BinToHex und TRegistry.ReadBinaryData
 
Hi DPler :hi:

Ich möchte aus der Registry Binärdaten rekursiv(!) auslesen und per BinToHex in den Hexadezimalwert umwandeln. Allerdings frage ich mich wie die Größe des Char-Arrays definieren soll wenn jeder Binärwert eine unterschiedliche Länge hat. Prinzipiell könnte ich offene Array nehmen, die Größe per Registry.GetDataSize bestimmen und das Array per SetLength() auf diese Größe bringen. Allerdings meckert dann BinToHex: [Fehler] Unit1.pas(34): Inkompatible Typen: 'Array' und 'Char'

Bei festen Arraywerten habe ich aber die Sorge dass ich dann zuviel Speicher reserviere, im Gegenzug möchte ich aber auch jeden Wert auslesen können und zu Große nicht ignorieren.

Habt ihr da ein paar Lösungsmöglichkeiten für mich?

Dani 31. Jul 2008 15:29

Re: BinToHex und TRegistry.ReadBinaryData
 
Delphi-Quellcode:
procedure Bla;
const
  TestKey = 'Software\Microsoft\Windows\CurrentVersion\Explorer';
  TestName = 'ShellState';
var
  Buffer, Text: PAnsiChar;
  BufferSize: Integer;
  Reg: TRegistry;
begin
  Buffer := nil;
  Text := nil;
  BufferSize := 0;

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKeyReadOnly(TestKey) then begin
      BufferSize := Reg.GetDataSize(TestName);
      GetMem(Buffer, BufferSize);
      GetMem(Text, BufferSize * 2);
      try
        Reg.ReadBinaryData(TestName, Buffer^, BufferSize);
        BinToHex(Buffer, Text, BufferSize);
        ShowMessage(Text);
      finally
        FreeMem(Text);
        FreeMem(Buffer);
        Reg.CloseKey;
      end;
    end else begin
      ShowMessage(Format('Kann Key %s nicht öffnen', [TestKey]));
    end;
  finally
    Reg.Free;
  end;
end;
Allerdings garantiert dir niemand, dass sich der Inhalt zwischen dem Aufruf von Reg.GetDataSize und Reg.ReadBinaryData nicht ändert (?) :|

Aurelius 31. Jul 2008 20:45

Re: BinToHex und TRegistry.ReadBinaryData
 
Danke für den Code, werde ich mal testen :thumb:

Luckie 31. Jul 2008 21:43

Re: BinToHex und TRegistry.ReadBinaryData
 
Das ist schlecht:
Delphi-Quellcode:
ShowMessage(Format('Kann Key %s nicht öffnen', [TestKey]));
Besser ist:
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
,
dann weiß man auch gleich, warum es zu einem Fehler kam.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz