读取存储在registry中的GUID值

我尝试读取在Delphiregistry中存储为一个binary值的GUID值。 当我用BintoHex读它时,结果却是相反的。 看来我必须交换字节,但我认为BinToHex会做到这一点。

我提到这个线程,但我找不到正确的解决scheme: 如何在Delphi中将字节数组转换为其hex表示它似乎是由于小Eendian。

下面,你可以看到存储在registry中的GUID

这是我的代码:

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

s的输出: 90E24D373F126545916439C4925E467B

GUID应该是FOLDERID_Downloads GUID:
{374DE290-123F-4565-9164-39C4925E467B}

请帮忙 这里

二进制形式的GUID最好被认为是一个记录。 事实上,在德尔福记录已经存在 – 这是TGUID

您只需将相关字节直接复制到TGUID类型的变量中,并完成您的工作。 如果你想要一个字符串表示,使用GUIDToString

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

这将自动处理所有的endian问题。 我们来看一下TGUID的声明:

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

您的代码将其视为一个直接的字节数组。 但是,在记录中, D1D2D3是小端机上不可或缺的一部分。 所以你的代码反转了前4个字节,那些属于D1 。 然后它反转D2的两个字节,还有D3的两个字节。 当然,GUID结尾的8个字节的数组不会颠倒过来。

所以,尽管你可以很容易地完成所有的字节交换工作,但是使用一个记录来完成这个过程要好得多,并且可以利用辅助函数将二进制GUID记录转换为格式正确的GUID字符串。