2013-02-12 6 views
5

Ich versuche, einen GUID-Wert als binary Wert in der Registrierung in Delphi gespeichert zu lesen. Wenn ich es mit BintoHex lese, ist das Ergebnis in umgekehrter Reihenfolge. Es scheint, dass ich Bytes austauschen muss, aber ich dachte, dass BinToHex es tun würde.lesen GUID-Wert in der Registrierung

ich auf diesen Thread refered aber ich nicht die richtige Lösung finden: how to convert byte array to its hex representation in Delphi Es scheint, dass es zu wenig Eendian zurückzuführen ist.

Unten können Sie die GUID in der Registry gespeichert sehen

Hier ist mein Code:

var 
s : string; 
buffer : pointer; 
... 

begin 
getmem(buffer, 1024*1024); 
.... 
reg.ReadBinaryData(iValueOfregistry, buffer^, 1024*1024); 
.... 
bintohex(pointer(longint(buffer)+14), PChar(s), 32); 

Ausgang für s: 90E24D373F126545916439C4925E467B

GUID sollte FOLDERID_Downloads GUID sein:
{374DE290-123F-4565-9164-39C4925E467B}

Bitte helfen Here

Antwort

8

Eine GUID in binärer Form ist am besten als ein Datensatz. In der Tat existiert der Datensatz in Delphi bereits - es ist TGUID.

Alles, was Sie tun müssen, ist die relevanten Bytes direkt in eine Variable vom Typ TGUID zu kopieren und Ihre Arbeit ist erledigt. Wenn Sie eine Zeichenfolgendarstellung wünschen, verwenden Sie GUIDToString.

var 
    GUID: TGUID; 
    strGUID: string; 
.... 
GUID := PGUID(PAnsiChar(buffer)+14)^; 
strGUID := GUIDToString(GUID); 

Dies kümmert sich automatisch um alle Endian-Probleme. Schauen wir uns die Erklärung von TGUID einen Blick:

TGUID = packed record 
    D1: LongWord; 
    D2: Word; 
    D3: Word; 
    D4: array[0..7] of Byte; 
end; 

Ihr Code diese Bytes als gerade Array behandelt. In dem Datensatz sind jedoch D1, D2 und D3 integrale Typen auf einer kleinen Endian-Maschine. Ihr Code kehrt also die ersten 4 Bytes um, die zu D1 gehören. Es kehrt dann die zwei Bytes D2 und auch die zwei Bytes D3 um. Das Array von 8 Bytes am Ende der GUID wird natürlich nicht umgekehrt.

So, während Sie leicht alle Byte-Swapping selbst tun können, ist es viel besser, einen Datensatz zu verwenden, und nutzen Sie die Hilfsfunktion, die einen binären GUID-Datensatz in eine ordnungsgemäß formatierte GUID-Zeichenfolge konvertiert.

+0

Die GUID ist nicht die einzige Sache in der binären Registrierungswert gespeichert. Also muss ich es in einem Puffer lesen und TGUID an der Position $ e in diesem Puffer lesen. Ich vermute, dass eine "Bewegung" vom Puffer (an der Position $ e) zu GUID den Job nicht macht, weil es eine Byte-zu-Byte-Kopie ist. Ist das wahr? Was schlägst du vor, David? – user382591

+1

Ein 'Move' wird den Job perfekt machen. Blit die Daten einfach auf eine 'TGUID' und der Job ist erledigt. Es kann ohne Verschieben mit einem Cast zu 'PGUID' gemacht werden. Das neueste Update zeigt dir wie. –

+1

David, du bist mein Guru – user382591