2009-08-28 26 views

Trả lời

13

Các mặt hàng này về lưu trữ nhóm tin InnoSetup:

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

tôi đã không kiểm tra nó.

[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

Đó là những gì tôi đang tìm kiếm. – MusiGenesis

+1

Ngoài ra, còn có một cuộc gọi API win32 khác để chuyển đổi GUID thô từ CoCreateGuid() thành một chuỗi đại diện theo định dạng {00000000-0000-0000-0000-000000000000}, điều này sẽ đơn giản hóa rất nhiều chức năng trên, nhưng tôi không nhớ những gì nó được đặt tên. – MusiGenesis

+2

StringFromCLSID là cuộc gọi API win32 thứ hai để sử dụng cho điều này, cũng từ ole32.dll. – MusiGenesis

1

Bạn có thể thực hiện việc này bằng cách gọi hàm Windows API CoCreateGuid (trong "OLE32.dll"), mà bạn khai báo bên trong phần [Mã] trong tập lệnh của bạn. Xin lỗi, tôi đã không sử dụng thiết lập Inno trong một thời gian vì vậy tôi không biết chính xác làm thế nào để làm điều này. Để giúp đỡ, đây là một lời tuyên bố mẫu API cho GetWindow() chức năng:

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

Và đây là một liên kết đến một mẫu VB cho việc sử dụng CoCreateGuid:

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

Một nơi nào đó trong tất cả điều này là của bạn câu trả lời.

+0

câu trả lời của Giorgian cho thấy cách thực hiện việc này trong Cài đặt Inno. – MusiGenesis

2

Dưới đây là một việc thực hiện phần nào sạch của FormatGuid, không có chức năng hex-định dạng không cần thiết (chúng ta có gì Format cho ?!):

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; 

Bạn vẫn cần phải xác định TGuid và nhập CoCreateGuid như trong các câu trả lời khác:

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

Thật không may, kết quả của các chức năng FormatGuid trong câu trả lời này đã không tạo ra một chuỗi đại diện của một GUID trong một định dạng hợp lệ. Thay vào đó, một chuỗi được tạo dưới dạng XXXXXXXX-XXXX-XXXX-XX-XX-XX-XX-XX-XX-XX-XX Xác thực được thực hiện qua http://guid.us/Test/GUID –

+0

An định dạng chuỗi thay thế được hiển thị tại: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TGUID.html Định dạng này xuất hiện để tạo GUID hợp lệ theo http: // guid.us/Test/GUID –

2

Tôi đã sử dụng giải pháp này một thời gian (chạy 5.5.0 (a) và 5.5. 1 (a)).

Tuy nhiên, khi tôi cập nhật lên 5.5.2 (u) - tập lệnh xây dựng của tôi không thành công do lỗi loại trùng lặp: 'TGUID'.

Để khắc phục nó, tôi đã phải loại bỏ:

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

này chỉ xảy ra trên các phiên bản Unicode - có nghĩa 5.5.2 (u) đã tích hợp sẵn trong loại GUID.

Các vấn đề liên quan