2009-08-28 11 views

Antwort

13

diese Gefunden auf ınnosetup Newsgroup-Archiv:

http://news.jrsoftware.org/news/innosetup/msg76234.html

ich es nicht getestet haben.

[Code] 

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

function CoCreateGuid(var Guid:TGuid):integer; 
external '[email protected] stdcall'; 

function inttohex(l:longword; digits:integer):string; 
var hexchars:string; 
begin 
hexchars:='ABCDEF'; 
setlength(result,digits); 
while (digits>0) do begin 
    result[digits]:=hexchars[l mod 16+1]; 
    l:=l div 16; 
    digits:=digits-1; 
end; 
end; 

function GetGuid(dummy:string):string; 
var Guid:TGuid; 
begin 
    if CoCreateGuid(Guid)=0 then begin 
    result:='{'+IntToHex(Guid.D1,8)+'-'+ 
      IntToHex(Guid.D2,4)+'-'+ 
      IntToHex(Guid.D3,4)+'-'+ 
      IntToHex(Guid.D4[0],2)+IntToHex(Guid.D4[1],2)+'-'+ 
      IntToHex(Guid.D4[2],2)+IntToHex(Guid.D4[3],2)+ 
      IntToHex(Guid.D4[4],2)+IntToHex(Guid.D4[5],2)+ 
      IntToHex(Guid.D4[6],2)+IntToHex(Guid.D4[7],2)+ 
      '}'; 
    end else 
    result:='{00000000-0000-0000-0000-000000000000}'; 
end; 

function InitializeSetup(): Boolean; 
begin 
    MsgBox(GetGuid(''), mbInformation, MB_OK); 
    Result := False; 
end; 
+0

Das ist, was ich gesucht habe. – MusiGenesis

+1

Es gibt auch einen anderen Win32-API-Aufruf, der die rohe GUID von CoCreateGuid() in eine Zeichenfolgendarstellung im Format {00000000-0000-0000-0000-000000000000} konvertiert, was die obige Funktion stark vereinfachen würde, aber ich erinnere mich nicht wie es heißt. – MusiGenesis

+2

StringFromCLSID ist der zweite win32-API-Aufruf, der dafür verwendet wird, auch von ole32.dll. – MusiGenesis

1

Sie können dies tun, indem Sie die Windows-API-Funktion CoCreateGuid (in "OLE32.dll") aufrufen, die Sie in einem [Code] -Abschnitt in Ihrem Skript deklarieren. Sorry, ich habe Inno Setup seit einiger Zeit nicht mehr verwendet, daher weiß ich nicht genau, wie ich das machen soll. Um zu helfen, hier ist ein Beispiel API-Deklaration für die GetWindow() Funktion:

Function GetWindow (HWND: Longint; uCmd: cardinal): Longint; 
    external '[email protected] stdcall'; 

Und hier ist ein Link zu einer VB Probe für CoCreateGuid mit:

http://support.microsoft.com/kb/176790

Irgendwo in all dies ist Ihre Antworten.

+0

giorgians Antwort zeigt, wie man das im Inno Setup macht. – MusiGenesis

2

Hier ist eine etwas sauberere Umsetzung FormatGuid, ohne unnötige Hex-Formatierung-Funktion (was haben wir Format für ?!):

function FormatGuid(Guid:TGuid):string; 
begin 
    result:=Format('%.8x-%.4x-%.4x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x', [Guid.D1, Guid.D2, Guid.D3, Guid.D4[0], Guid.D4[1], Guid.D4[2], Guid.D4[3], Guid.D4[4], Guid.D4[5], Guid.D4[6], Guid.D4[7]]); 
end; 

Sie noch TGuid definieren müssen und importieren CoCreateGuid als in den anderen Antworten:

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

function CoCreateGuid(var Guid:TGuid):integer; 
external '[email protected] stdcall'; 
+0

Leider hat das Ergebnis der FormatGuid-Funktion in dieser Antwort keine Zeichenfolgedarstellung einer GUID in einem gültigen Format erzeugt. Stattdessen wurde eine Zeichenkette wie folgt erzeugt: XXXXXXXX-XXXX-XXXX-XX-XX-XX-XX-XX-XX-XX-XX Die Validierung erfolgte über http://guid.us/Test/GUID –

+0

An alternatives Zeichenfolgenformat wird angezeigt unter: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TGUID.html Dieses Format scheint gültige GUIDs gemäß http: // zu erzeugen. guid.us/Test/GUID –

2

Ich war diese Lösung für eine Weile (mit 5.5.0 (a) und 5.5. 1 (a)).

Allerdings, wenn ich auf 5.5.2 (u) aktualisiert - meine Build-Skripts fehlgeschlagen wegen eines doppelten Typs Fehler: 'TGUID'.

Um es zu beheben, musste ich entfernen:

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

Dies ist nur auf der Unicode-Version geschieht - Was bedeutet: 5.5.2 (u) in GUID-Typ eine gebaut hat.

Verwandte Themen