2009-08-28 2 views

Répondre

13

trouvé sur archives newsgroup InnoSetup:

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

Je ne l'ai pas testé.

[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

C'est ce que je cherchais. – MusiGenesis

+1

En outre, il existe un autre appel API Win32 qui convertit le GUID brut de CoCreateGuid() en une représentation sous forme de chaîne au format {00000000-0000-0000-0000-000000000000}, ce qui simplifierait grandement la fonction ci-dessus, mais je ne me souviens pas ce qu'il est nommé. – MusiGenesis

+2

StringFromCLSID est le deuxième appel d'API Win32 à utiliser pour cela, également à partir de ole32.dll. – MusiGenesis

1

Vous pouvez le faire en appelant la fonction Windows API CoCreateGuid (dans "OLE32.dll"), que vous déclarez dans une section [Code] dans votre script. Désolé, je n'ai pas utilisé Inno Setup depuis un moment, donc je ne sais pas exactement comment faire. Pour vous aider, voici une déclaration d'API exemple pour la fonction GetWindow():

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

Et voici un lien vers un échantillon de VB pour l'utilisation CoCreateGuid:

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

Quelque part dans tout cela est votre répondre.

+0

La réponse de giorgian montre comment faire cela dans Inno Setup. – MusiGenesis

2

est ici une mise en œuvre un peu plus propre de FormatGuid, sans la fonction de mise en forme hexagonale inutile (qu'avons-nous Format pour ?!):

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; 

Vous devez toujours définir TGuid et importer CoCreateGuid comme dans les autres réponses:

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

Malheureusement, le résultat de la fonction FormatGuid dans cette réponse n'a pas produit une représentation sous forme de chaîne d'un GUID dans un format valide. Au lieu de cela, une chaîne a été produite comme ci-dessous. XXXXXXXX-XXXX-XXXX-XX-XX-XX-XX-XX-XX-XX-XX La validation a été réalisée via http://guid.us/Test/GUID –

+0

An format de chaîne alternative est montré à: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/FR/html/delphivclwin32/System_TGUID.html Ce format a semblé produire des GUID valides selon http: // guid.us/Test/GUID –

2

J'utilisais cette solution pendant un certain temps (fonctionnant sous 5.5.0 (a) et 5.5. 1 (a)).

Cependant, lorsque j'ai mis à jour vers 5.5.2 (u) - mes scripts de construction ont échoué à cause d'une erreur de type en double: 'TGUID'.

Pour le fixer, je devais enlever:

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

Cela ne se passe sur la version Unicode - ce qui signifie 5.5.2 (u) est un type construit GUID.

Questions connexes