2013-02-12 21 views
5

Tôi cố gắng đọc giá trị GUID được lưu trữ dưới dạng giá trị binary trong đăng ký tại Delphi. Khi tôi đọc nó với BintoHex, nhưng kết quả theo thứ tự ngược lại. Có vẻ như tôi phải hoán đổi byte nhưng tôi nghĩ BinToHex sẽ làm điều đó.Đọc giá trị GUID được lưu trữ trong sổ đăng ký

Tôi đã tham chiếu đến chủ đề này nhưng tôi không thể tìm ra giải pháp phù hợp: how to convert byte array to its hex representation in Delphi Dường như đó là do Eendian ít.

Dưới đây, bạn sẽ nhìn thấy GUID được lưu trữ trong registry

Đây là mã của tôi:

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

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

Output cho s: 90E24D373F126545916439C4925E467B

GUID nên FOLDERID_Downloads GUID:
{374DE290-123F-4565-9164-39C4925E467B}

Xin giúp Here

Trả lời

8

Một GUID dưới dạng nhị phân là suy nghĩ tốt nhất là một kỷ lục. Thật vậy trong Delphi hồ sơ đã tồn tại - nó là TGUID.

Tất cả những gì bạn cần làm là sao chép các byte có liên quan trực tiếp vào một biến loại TGUID và công việc của bạn đã hoàn tất. Nếu bạn muốn biểu diễn chuỗi, hãy sử dụng GUIDToString.

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

Điều này sẽ tự động xử lý tất cả các vấn đề cuối cùng. Hãy xem tuyên bố của TGUID:

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

Mã của bạn coi đây là mảng byte thẳng. Tuy nhiên, trong hồ sơ, D1, D2D3 là các loại tích phân trên một máy cuối nhỏ. Vì vậy, mã của bạn đảo ngược 4 byte đầu tiên, những mã thuộc về D1. Sau đó nó đảo ngược hai byte của D2 và cũng có hai byte là D3. Mảng 8 byte ở cuối GUID không bị đảo ngược, tất nhiên.

Vì vậy, trong khi bạn có thể sẵn sàng làm tất cả những byte trao đổi chính mình, đó là tốt hơn để sử dụng một kỷ lục để làm như vậy, và tận dụng lợi thế của hàm helper có thể chuyển đổi một kỷ lục GUID nhị phân thành một chuỗi GUID được định dạng đúng.

+0

GUID không phải là thứ duy nhất được lưu trữ trong giá trị đăng ký nhị phân. Vì vậy, tôi phải đọc nó trong một bộ đệm và đọc TGUID ở vị trí $ e trong bộ đệm đó. Tôi nghi ngờ một "di chuyển" từ bộ đệm (tại vị trí $ e) để GUID sẽ không làm công việc vì nó là một bản sao byte-to-byte. Điều đó có đúng không? Anh đề nghị gì, David? – user382591

+1

Một 'Di chuyển' sẽ thực hiện công việc một cách hoàn hảo. Chỉ cần blit dữ liệu vào một 'TGUID' và công việc được thực hiện. Nó có thể được thực hiện mà không cần di chuyển bằng cách sử dụng một diễn viên để 'PGUID'. Bản cập nhật mới nhất cho bạn biết cách thực hiện. –

+1

David, bạn là Guru của tôi – user382591

Các vấn đề liên quan