如何在Inno Setup中生成新的GUID?

时间:2009-08-28 13:45:35

标签: guid inno-setup

有没有办法从Inno Setup脚本中生成新的GUID?

4 个答案:

答案 0 :(得分:13)

在innosetup新闻组档案中找到了这个:

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

我还没有测试过。

[Code]

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

function CoCreateGuid(var Guid:TGuid):integer;
 external 'CoCreateGuid@ole32.dll stdcall';

function inttohex(l:longword; digits:integer):string;
var hexchars:string;
begin
 hexchars:='0123456789ABCDEF';
 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;

答案 1 :(得分:3)

我暂时使用此解决方案(运行5.5.0(a)和5.5.1(a))。

但是,当我更新到5.5.2(u)时 - 由于重复的类型错误,我的构建脚本失败:'TGUID'。

为了解决这个问题,我不得不删除:

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

这只发生在Unicode版本上 - 意味着5.5.2(u)具有内置的GUID类型。

答案 2 :(得分:2)

这是FormatGuid的一个更简洁的实现,没有不必要的十六进制格式化功能(我们有Format为什么?!):

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;

您仍然需要定义TGuid并导入CoCreateGuid,如同其他答案一样:

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

function CoCreateGuid(var Guid:TGuid):integer;
 external 'CoCreateGuid@ole32.dll stdcall';

答案 3 :(得分:1)

您可以通过调用Windows API函数CoCreateGuid(在“OLE32.dll”中)来执行此操作,该函数在脚本的[Code]部分中声明。对不起,我有一段时间没有使用过Inno Setup,所以我不确切知道如何做到这一点。为了提供帮助,这里是GetWindow()函数的示例API声明:

Function GetWindow (HWND: Longint; uCmd: cardinal): Longint;
    external 'GetWindow@user32.dll stdcall';

这里是使用CoCreateGuid的VB示例的链接:

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

所有这些都是你的答案。