Is there a way to generate a new GUID from inside the Inno Setup script ?
Found this on innosetup newsgroup archive:
http://news.jrsoftware.org/news/innosetup/msg76234.html
I haven't tested it.
[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:='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;
Here's a somewhat cleaner implementation of FormatGuid
, without the unnecessary hex-formatting function (what do we have Format
for?!):
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;
You still need to define TGuid
and import CoCreateGuid
as in the other answers:
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';
I was using this solution for a while (running 5.5.0 (a) and 5.5.1(a)).
However, when I updated to 5.5.2 (u) - my build scripts failed because of a duplicate type error: 'TGUID'.
In order to fix it, I had to remove:
type
TGUID = record
D1: LongWord;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
This is only happening on the Unicode version - meaning 5.5.2 (u) has a built in GUID type.
Based on the answer and comments from MusiGenesis and giorgian, here is a version that uses the StringFromGUID2 Win32 call for formatting the GUID.
Tested in Inno Setup 6.2
function CoCreateGuid(var Guid : TGuid): integer;
external '[email protected] stdcall';
function StringFromGUID2(var rguid : TGuid; lpsz : string; cchMax : integer): integer;
external '[email protected] stdcall';
function GenerateGUID(): string;
var
Guid: TGuid;
GuidString: string;
GuidLength: integer;
begin
if CoCreateGuid(Guid) = 0 then
begin
GuidString := '';
SetLength(GuidString, 100);
GuidLength := StringFromGUID2(Guid, GuidString, 100);
if GuidLength > 0 then
begin
SetLength(GuidString, GuidLength - 1);
Result := GuidString;
end else begin
RaiseException('GUID conversion to string failed');
end;
end else begin
RaiseException('GUID creation failed');
end;
end;
{code:GenerateGUID}
. –
Petite You can do this by calling the Windows API function CoCreateGuid (in "OLE32.dll"), which you declare inside a [Code] section in your script. Sorry, I haven't used Inno Setup in awhile so I don't know exactly how to do this. To help, here's a sample API declaration for the GetWindow() function:
Function GetWindow (HWND: Longint; uCmd: cardinal): Longint;
external '[email protected] stdcall';
And here's a link to a VB sample for using CoCreateGuid:
http://support.microsoft.com/kb/176790
Somewhere in all of this is your answer.
© 2022 - 2024 — McMap. All rights reserved.