2009-08-28 23 views

risposta

13

Trovato questo su archivio newsgroup InnoSetup:

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

non l'ho testato.

[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

Questo è quello che stavo cercando. – MusiGenesis

+1

Inoltre, c'è un'altra chiamata API win32 che converte il GUID raw da CoCreateGuid() in una rappresentazione stringa nel formato {00000000-0000-0000-0000-000000000000}, che semplificherebbe notevolmente la funzione sopra, ma non ricordo come si chiama – MusiGenesis

+2

StringFromCLSID è la seconda chiamata API win32 da utilizzare per questo, anche da ole32.dll. – MusiGenesis

1

È possibile eseguire questa operazione chiamando la funzione dell'API di Windows CoCreateGuid (in "OLE32.dll"), che si dichiara all'interno di una sezione [Codice] del proprio script. Scusa, non ho usato Inno Setup per un po ', quindi non so esattamente come farlo. Per aiutare, ecco una dichiarazione campione di API per la GetWindow() Funzione:

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

Ed ecco un link ad un campione VB per l'utilizzo di CoCreateGuid:

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

Da qualche parte in tutto questo è tuo risposta.

+0

La risposta di giorgian mostra come eseguire questa operazione in Inno Setup. – MusiGenesis

2

Ecco un'implementazione un po 'più pulita di FormatGuid, senza la funzione hex-formattazione inutili (che cosa abbiamo Format per ?!):

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; 

È ancora necessario definire TGuid e importare CoCreateGuid come nelle altre risposte:

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

Sfortunatamente, il risultato della funzione FormatGuid in questa risposta non ha prodotto una rappresentazione di stringa di un GUID in un formato valido. Invece, è stata prodotta una stringa come sotto XXXXXXXX-XXXX-XXXX-XX-XX-XX-XX-XX-XX La convalida è stata effettuata tramite http://guid.us/Test/GUID –

+0

An Il formato stringa alternativo è mostrato a: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TGUID.html Questo formato sembra produrre GUID validi in base a http: // guid.us/Test/GUID –

2

Stavo usando questa soluzione per un po '(in esecuzione 5.5.0 (a) e 5.5. 1 (a)).

Tuttavia, quando ho aggiornato a 5.5.2 (u) - i miei script di compilazione non sono riusciti a causa di un errore di tipo duplicato: "TGUID".

Al fine di risolvere il problema, ho dovuto togliere:

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

Questo sta accadendo solo sulla versione Unicode - il che significa 5.5.2 (u) è dotato di un tipo GUID.

Problemi correlati