Как создать новый GUID в Inno Setup?
есть ли способ создать новый идентификатор GUID из сценария установки Inno ?
4 ответов
нашел это в архиве группы новостей 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;
Я некоторое время использовал это решение (запуск 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.
вот несколько более чистая реализация 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';
вы можете сделать это, вызвав функцию Windows API CoCreateGuid (в "OLE32.dll"), который вы объявляете внутри раздела [Code] в своем скрипте. Извините, я не использовал Inno Setup некоторое время, поэтому я не знаю, как это сделать. Чтобы помочь, вот пример объявления API для функции GetWindow ():
Function GetWindow (HWND: Longint; uCmd: cardinal): Longint;
external 'GetWindow@user32.dll stdcall';
и вот ссылка на образец VB для использования CoCreateGuid:
http://support.microsoft.com/kb/176790
где-то во всем вот твой ответ.