2013-02-12 20 views
5

レジストリにbinaryの値として格納されているGUID値をDelphiで読み取ろうとしています。 BintoHexで読むと、逆の結果になります。 バイトをスワップする必要があるようですが、BinToHexはそれをやると思いました。レジストリに格納されているGUID値を読み取る

私はこのスレッドに言及しましたが、私は適切な解決策を見つけることができません: how to convert byte array to its hex representation in Delphi それは少しEendianによると思われます。

以下

、あなたはここでレジストリ

に保存されている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); 

出力: 90E24D373F126545916439C4925E467B

GUIDはFOLDERID_Downloads GUIDする必要があります:
{374DE290-123F-4565-9164-39C4925E467B}

バイナリ形式で Here

答えて

8

A GUIDを助けてくださいは、記録としての最高の考えです。実際、デルファイのレコードは既に存在しています - それはTGUIDです。

関連するバイトをタイプTGUIDの変数に直接コピーして、ジョブが完了するだけです。文字列表現が必要な場合は、GUIDToStringを使用します。

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

これはすべてのエンディアンの問題を自動的に処理します。さんはTGUIDの宣言を見てみましょう:

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

あなたのコードはバイトの直線配列としてこれを扱います。しかし、記録では、D1,D2およびD3はリトルエンディアンマシン上で不可欠なタイプです。したがって、あなたのコードは最初の4バイトを逆転します.D1に属するものです。次に、D2の2バイトと、D3の2バイトを逆にします。もちろん、GUIDの末尾にある8バイトの配列は元に戻されません。

したがって、すべてのバイトスワップを簡単に行うことができますが、レコードを使用してバイナリGUIDレコードを適切にフォーマットされたGUID文字列に変換するヘルパ関数を利用する方がはるかに優れています。

+0

GUIDは、バイナリレジストリ値に格納されている唯一のものではありません。だから、私はそれをバッファーで読み取って、そのバッファーの$ e位置でTGUIDを読み取らなければなりません。私はバイトからバイトへのコピーであるため、GUIDがバッファを(位置$ eに)移動させてもジョブを実行しないと思われます。本当?何をお勧めしますか? – user382591

+1

「移動」はジョブを完全に行います。データを 'TGUID'にblitするだけで、ジョブが完了します。 'PGUID'へのキャストを使用して移動することなく実行できます。最新のアップデートはあなたにどのように表示されます。 –

+1

David、あなたは私の教祖です – user382591