2009-08-28 27 views

Respuesta

13

encontrado esto en archivo de grupo de noticias ınnosetup:

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

no he probado.

[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

Eso es lo que estaba buscando. – MusiGenesis

+1

Además, hay otra llamada API de win32 que convierte el GUID sin formato de CoCreateGuid() en una representación de cadena en el formato {00000000-0000-0000-0000-000000000000}, lo que simplificaría en gran medida la función anterior, pero no recuerdo como se llama – MusiGenesis

+2

StringFromCLSID es la segunda llamada a la API win32 que se utiliza para esto, también desde ole32.dll. – MusiGenesis

1

Puede hacerlo llamando a la función de API de Windows CoCreateGuid (en "OLE32.dll"), que declara dentro de una sección [Código] en su secuencia de comandos. Lo siento, no he usado Inno Setup por un tiempo, así que no sé exactamente cómo hacer esto. Para ayudar, aquí está una declaración del API de ejemplo para el GetWindow() Función:

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

Y aquí hay un enlace a una muestra de VB para el uso de CoCreateGuid:

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

En alguna parte de todo esto es que su responder.

+0

La respuesta de giorgian muestra cómo hacerlo en Inno Setup. – MusiGenesis

2

Aquí hay una aplicación un tanto más limpio de FormatGuid, sin la función innecesaria hexagonal de formato (¿qué tenemos Format para ?!):

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; 

Todavía es necesario definir TGuid e importar CoCreateGuid como en las otras respuestas:

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

Desafortunadamente, el resultado de la función FormatGuid en esta respuesta no produjo una representación de cadena de un GUID en un formato válido. En su lugar, se produjo una cadena como se detalla a continuación XXXXXXXX-XXXX-XXXX-XX-XX-XX-XX-XX-XX-XX-XX La validación se llevó a cabo a través de http://guid.us/Test/GUID –

+0

An el formato de cadena alternativo se muestra en: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TGUID.html Este formato parece producir GUID válidos de acuerdo con http: // guid.us/Test/GUID –

2

que estaba usando esta solución durante un tiempo (que se ejecuta 5.5.0 (a) y 5.5. 1 (a)).

Sin embargo, cuando actualicé a 5.5.2 (u) - mis scripts de compilación fallaron debido a un error de tipo duplicado: 'TGUID'.

Para solucionarlo, tuve que quitar:

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

Esto sólo ocurre en la versión Unicode - lo que significa 5.5.2 (u) ha construido en un tipo GUID.

Cuestiones relacionadas