2013-02-12 18 views
5

Próbuję odczytać wartość GUID zapisaną jako wartość binary w rejestrze w Delphi. Po przeczytaniu go z BintoHex, ale wynik jest w odwrotnej kolejności. Wygląda na to, że muszę zamienić bajty, ale myślałem, że BinToHex to zrobi.Odczytaj wartość GUID zapisaną w rejestrze

Podobał mi się ten wątek, ale nie mogę znaleźć odpowiedniego rozwiązania: how to convert byte array to its hex representation in Delphi Wygląda na to, że jest to spowodowane małym Eendianem.

Poniżej można zobaczyć GUID zapisany w rejestrze

Oto mój kod:

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

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

Wyjście S: 90E24D373F126545916439C4925E467B

GUID powinny być FOLDERID_Downloads GUID:
{374DE290-123F-4565-9164-39C4925E467B}

Proszę o pomoc Here

Odpowiedz

8

GUID w postaci binarnej jest najlepsza myśl jako rekord. Rzeczywiście w Delphi rekord już istnieje - jest to TGUID.

Wystarczy skopiować odpowiednie bajty bezpośrednio do zmiennej typu TGUID, a zadanie zostanie wykonane. Jeśli chcesz reprezentację ciągów, użyj GUIDToString.

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

To zajmie się automatycznie wszystkimi problemami endian. Rzućmy okiem na deklaracji TGUID:

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

Kod traktuje to jako prostą tablicę bajtów. Jednak w rejestrze, D1, D2 i D3 są integralnymi typami na małej maszynie endianowej. Zatem twój kod odwraca pierwsze 4 bajty, należące do D1. Następnie odwraca dwa bajty D2, a także dwa bajty D3. Tablica 8 bajtów na końcu identyfikatora GUID nie jest oczywiście odwrócona.

Tak więc, chociaż można łatwo wymienić cały bajt, samemu, lepiej jest użyć rekordu, aby to zrobić, i skorzystać z funkcji pomocnika, która konwertuje binarny rekord GUID na poprawnie sformatowany ciąg GUID.

+0

GUID nie jest jedyną rzeczą przechowywaną w wartości rejestru binarnego. Tak więc, muszę odczytać go w buforze i odczytać TGUID na pozycji $ e w tym buforze. Podejrzewam, że "ruch" z bufora (na pozycji $ e) do GUID nie wykona zadania, ponieważ jest to kopia bajt-bajt. Czy to prawda? Co sugerujesz, David? – user382591

+1

"Przenieś" doskonale wykona zadanie. Po prostu przenieś dane na 'TGUID' i zadanie zostanie wykonane. Można to zrobić bez przenoszenia za pomocą rzutowania do 'PGUID'. Najnowsza aktualizacja pokazuje, jak to zrobić. –

+1

Dawidzie, jesteś moim Guru – user382591