朋友Fishout写了一篇关于在InstallShield中,如何用脚本生成GUID,写的非常好,在征得朋友Fishout的同意后特转到这里与大家分享,原文链接:http://blog.csdn.net/fishout/archive/2010/09/01/5855822.aspx
版权归原作者所有,未经同意严禁转载,大家也可以访问Fishout的Blog。
下面是全文:
作者:Fishout
GUID---Globally Unique Identifier(全球唯一标识符)是通过特定算法产生并具有唯一性的一个二进制长度为128位的数字,在安装过程中,有时需要生成GUID供安装过程调用,以下代码的出处是国外哪个网站已不记得了,只是自己用过不错,贴出来供大家参考。
1
//
函数定义描述
2 prototype OLE32.CoCreateGuid( POINTER );
3 prototype OLE32.StringFromGUID2( POINTER , BYREF STRING , LONG );
4 prototype CreateStringGUID ( BYREF STRING );
5
6 typedef GUID
7 begin
8 LONG Data1;
9 SHORT Data2;
10 SHORT Data3;
11 STRING Date4[ 8 ];
12 end ;
13 //---------------------------------------------------------------------------
14 // 函数: CreateStringGUID --- 通过调用系统OLE32.DLL产生GUID字符串
15 //---------------------------------------------------------------------------
16 function CreateStringGUID(strGuid)
17
18 NUMBER nResult, cbMax, i;
19 GUID gGuid;
20 GUID POINTER pGuid;
21 STRING lpszGuid;
22
23 begin
24
25 // 初始化变量及函数指针
26 pGuid = & gGuid;
27 gGuid.Data1 = 0 ;
28 gGuid.Data2 = 0 ;
29 gGuid.Data3 = 0 ;
30 cbMax = 64 ;
31 if UseDLL ( WINSYSDIR ^ " OLE32.dll " ) < 0 then
32 MessageBox( " 不能打开 OLE32.DLL.文件! " , WARNING );
33 return - 1 ;
34 endif;
35
36 // 调用OLE32.DLL中的函数CoCreateGuid获取GUID - pGuid
37 nResult = CoCreateGuid(pGuid);
38 if nResult < 0 then
39 MessageBox( " 调用 OLE32.DLL 失败 - 函数:CoCreateGuid() " , WARNING );
40 return - 1 ;
41 endif;
42
43 // 调用OLE32.DLL中的函数StringFromGUID2并转换pGuid为串 - strGuid
44 nResult = StringFromGUID2(pGuid, lpszGuid, cbMax);
45 if nResult < 0 then
46 M e ssageBox( " 调用 OLE32.DLL 失败 - 函数:StringFromGUID2() " , WARNING );
47 return - 1 ;
48 endif;
49
50 // 转换unicode串strGuid为ANSI串
51 for i = 0 to nResult - 1
52 strGuid[i] = lpszGuid [i * 2 ];
53 endfor;
54
55 nResult = StrSub (strGuid, strGuid, 0 , 39 );
56 if nResult < 0 then
57 MessageBox( " 转换 GUID 失败. " , WARNING );
58 return - 1 ;
59 endif;
60
61 nResult = UnUseDLL( " OLE32.dll " );
62
63 end ;
2 prototype OLE32.CoCreateGuid( POINTER );
3 prototype OLE32.StringFromGUID2( POINTER , BYREF STRING , LONG );
4 prototype CreateStringGUID ( BYREF STRING );
5
6 typedef GUID
7 begin
8 LONG Data1;
9 SHORT Data2;
10 SHORT Data3;
11 STRING Date4[ 8 ];
12 end ;
13 //---------------------------------------------------------------------------
14 // 函数: CreateStringGUID --- 通过调用系统OLE32.DLL产生GUID字符串
15 //---------------------------------------------------------------------------
16 function CreateStringGUID(strGuid)
17
18 NUMBER nResult, cbMax, i;
19 GUID gGuid;
20 GUID POINTER pGuid;
21 STRING lpszGuid;
22
23 begin
24
25 // 初始化变量及函数指针
26 pGuid = & gGuid;
27 gGuid.Data1 = 0 ;
28 gGuid.Data2 = 0 ;
29 gGuid.Data3 = 0 ;
30 cbMax = 64 ;
31 if UseDLL ( WINSYSDIR ^ " OLE32.dll " ) < 0 then
32 MessageBox( " 不能打开 OLE32.DLL.文件! " , WARNING );
33 return - 1 ;
34 endif;
35
36 // 调用OLE32.DLL中的函数CoCreateGuid获取GUID - pGuid
37 nResult = CoCreateGuid(pGuid);
38 if nResult < 0 then
39 MessageBox( " 调用 OLE32.DLL 失败 - 函数:CoCreateGuid() " , WARNING );
40 return - 1 ;
41 endif;
42
43 // 调用OLE32.DLL中的函数StringFromGUID2并转换pGuid为串 - strGuid
44 nResult = StringFromGUID2(pGuid, lpszGuid, cbMax);
45 if nResult < 0 then
46 M e ssageBox( " 调用 OLE32.DLL 失败 - 函数:StringFromGUID2() " , WARNING );
47 return - 1 ;
48 endif;
49
50 // 转换unicode串strGuid为ANSI串
51 for i = 0 to nResult - 1
52 strGuid[i] = lpszGuid [i * 2 ];
53 endfor;
54
55 nResult = StrSub (strGuid, strGuid, 0 , 39 );
56 if nResult < 0 then
57 MessageBox( " 转换 GUID 失败. " , WARNING );
58 return - 1 ;
59 endif;
60
61 nResult = UnUseDLL( " OLE32.dll " );
62
63 end ;
保存上述代码为:CreateStringGUID.rul,在主程序中这样调用:
#include "CreateStringGUID.rul"
STRING StringGUID
// 生成服务器GUID号
CreateStringGUID(StringGUID);