Data Type in InstallShield And Win32API Data Type
BOOL TRUE or FALSE
CHAR 8-bit 有符号字符
DWORD 同NUMBER
HWND 窗口句柄(内部类型是NUMBER)
INT 同NUMBER
LIST 指向InstallShield list的指针(内部类型是NUMBER)
LONG 同NUMBER
LPSTR 同POINTER
NUMBER 有符号4字节整数
POINTER 指向数据的指针(如int i;p=&i)
SHORT 同NUMBER
STRING 字符串
Call API For Example
prototype KERNEL32.GetVolumeInformation(BYREF STRING, BYREF STRING, NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF STRING, NUMBER);
附加一篇不错的文章
installshield安装程序,包括Mysql初始化、安装jre、配置环境变量、简单注册码生成
- 曾经使用installshield制作的安装程序,包括Mysql初始化、安装jre、配置环境变量、简单注册码生成。
- //
- // File Name: Setup.rul
- //
- // Description: InstallShield script
- //
- // Comments: This script was generated based on the selections you made in
- // the Project Wizard. Refer to the help topic entitled "Modify
- // the script that the Project Wizard generates" for information
- // on possible next steps.
- //
- /an///
- // Include header files
- #include "ifx.h"
- // string defines
- installation declarations ///
- // ----- DLL function prototypes -----
- // your DLL function prototypes
- // ---- script function prototypes -----
- // your script function prototypes
- // your global variables
- NUMBER volumeNum;
- //Before using the GetVolumeInformation API you will need to prototype it
- prototype KERNEL32.GetVolumeInformation(BYREF STRING, BYREF STRING, NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF NUMBER, BYREF STRING, NUMBER);
- //prototype for the custom InstallScript function
- prototype GetVolumeSerial();
- //function definition
- function GetVolumeSerial()
- STRING lpRootPathName;
- STRING lpVolumeNameBuffer;
- NUMBER nVolumeNameSize;
- NUMBER lpVolumeSerialNumber;
- NUMBER lpMaximumComponentLength;
- NUMBER lpFileSystemFlags;
- STRING lpFileSystemNameBuffer;
- NUMBER nFileSystemNameSize;
- BOOL APIReturn;
- begin
- lpRootPathName="d://";
- nVolumeNameSize=60;
- nFileSystemNameSize=60;
- //APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
- APIReturn=GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
- if (APIReturn) then
- volumeNum = lpVolumeSerialNumber ;
- if (volumeNum < 0) then
- volumeNum = 0 - volumeNum;
- endif;
- //NumToStr(volumeNum,lpVolumeSerialNumber);
- //SprintfBox(INFORMATION, "", "Volume= %s/nVolume Serial= %d", lpRootPathName, lpVolumeSerialNumber);
- if (volumeNum > 2139999999 - 135792468) then
- //volumeNum = 123456789;
- volumeNum = volumeNum - volumeNum/100000000*100000000;
- endif;
- else
- volumeNum = 123456789;
- //MessageBox("Failure.",0);
- endif;
- end ;
- prototype getNumString();
- function getNumString()
- number numSpace;
- number numMen;
- string tmpString;
- begin
- //tmpNum = GetWindowHandle(HWND_INSTALL); //安装主窗口的句柄
- //numSpace = GetDiskSpace("c://"); //指定驱动器上的空闲磁盘空间
- numSpace = GetDiskSpaceEx("c://",KBYTES); //指定驱动器上的空闲磁盘空间 BYTES
- //numMen = GetMemFree(); //运行在Microsoft Windows下的一个应用程序可用的内存大小
- numMen = GetDiskSpaceEx("d://",KBYTES);
- if numSpace < 10000 then
- numSpace = 11360000;
- else
- numSpace = (numSpace - numSpace/10000*10000)*10000;
- endif;
- if numMen < 10000 then
- numMen = 7521;
- else
- numMen = numMen - numMen/10000*10000;
- endif;
- volumeNum = 100000000 + numSpace + numMen;
- //NumToStr(tmpString,volumeNum);
- // MessageBox(tmpString,0);
- end;
- //
- //
- // FUNCTION: OnFirstUIBefore
- //
- // EVENT: FirstUIBefore event is sent when installation is run for the first
- // time on given machine. In the handler installation usually displays
- // UI allowing end user to specify installation parameters. After this
- // function returns, ComponentTransferData is called to perform file
- // transfer.
- //
- ///
- function OnFirstUIBefore()
- number nResult,nSetupType;
- string szTitle, szMsg;
- string szLicenseFile, szQuestion;
- string szName, szCompany, szSerial;
- string szFile;
- string szTargetPath;
- string szDir;
- string szfolder;
- string szComponents, szTargetdir;
- number nLevel;
- LIST listStartCopy;
- LIST list;
- number nvSize;
- string szField1, svEdit1,szField2, svEdit2;
- string localNum;
- number tmpNum;
- string tmpCheckString;
- string checkString;
- begin
- // TO DO: if you want to enable background, window title, and caption bar title
- // SetTitle( @TITLE_MAIN, 24, WHITE );
- // SetTitle( @TITLE_CAPTIONBAR, 0, BACKGROUNDCAPTION );
- // Enable( FULLWINDOWMODE );
- // Enable( BACKGROUND );
- // SetColor(BACKGROUND,RGB (0, 128, 128));
- GetVolumeSerial();
- //getNumString();
- tmpNum = volumeNum;
- tmpNum = tmpNum - tmpNum / 100 * 100;
- NumToStr(tmpCheckString,tmpNum);
- if (tmpCheckString == "0") then
- tmpCheckString = "0X";
- endif;
- checkString = "B" + tmpCheckString + "_";
- tmpNum = volumeNum / 100;
- tmpNum = tmpNum - tmpNum / 100 * 100;
- NumToStr(tmpCheckString,tmpNum);
- if (tmpCheckString == "0") then
- tmpCheckString = "0X";
- endif;
- checkString = checkString + "K" + tmpCheckString + "_";
- tmpNum = volumeNum / 10000;
- tmpNum = tmpNum - tmpNum / 100 * 100;
- NumToStr(tmpCheckString,tmpNum);
- if (tmpCheckString == "0") then
- tmpCheckString = "0X";
- endif;
- checkString = checkString + "X" + tmpCheckString + "_";
- tmpNum = volumeNum / 1000000;
- tmpNum = tmpNum - tmpNum / 100 * 100;
- NumToStr(tmpCheckString,tmpNum);
- if (tmpCheckString == "0") then
- tmpCheckString = "0X";
- endif;
- checkString = checkString + "T" + tmpCheckString;
- //MessageBox(checkString,INFORMATION);
- //变换volumeNum的值
- //B3242_K423_X342_T3423
- volumeNum = volumeNum + 135792468;
- NumToStr(localNum,volumeNum);
- //MessageBox(localNum,INFORMATION);
- //copy images
- nResult = XCopyFile(SRCDIR ^ "xxx//icons//media//*.gif", "c://xxx//icons//media//",EXCLUDE_SUBDIR);
- nResult = XCopyFile(SRCDIR ^ "xxx//icons//teacher//*.jpg", "c://xxx//icons//teacher//",EXCLUDE_SUBDIR);
- CreateDir("c://xxx//resc//");
- if (nResult != 0) then
- MessageBox ("图片拷贝出错!", SEVERE);
- endif;
- nSetupType = TYPICAL;
- TARGETDIR = PROGRAMFILES ^@COMPANY_NAME ^@PRODUCT_NAME;
- szDir = TARGETDIR;
- SHELL_OBJECT_FOLDER = @FOLDER_NAME;
- szName = "";
- szCompany = "";
- szSerial = "";
- Dlg_Start:
- // beginning of dialogs label
- Dlg_SdWelcome:
- szTitle = "xxxx系统";
- szMsg = " 确定是否继续安装?继续请按【下一步(next)】";
- nResult = SdWelcome( szTitle, szMsg );
- if (nResult = BACK) goto Dlg_Start;
- //Dlg_SdLicense:
- // szLicenseFile = SUPPORTDIR ^ "license.txt";
- // szTitle = "xxxx系统";
- // szMsg = "许可协议";
- // szQuestion = "您是否接受该协议?接受请按【是(Yes)】。继续安装必须接受该协议。";
- // nResult = SdLicense( szTitle, szMsg, szQuestion, szLicenseFile );
- // if (nResult = BACK) goto Dlg_SdWelcome;
- Dlg_SdShowInfoList:
- //szFile = SUPPORTDIR ^ "infolist.txt";
- //list = ListCreate( STRINGLIST );
- //ListReadFromFile( list, szFile );
- szTitle = "系统本地编号";
- szMsg = "将下面的本地编号发送给权限授予机构,在接收到相应的注册码后,您将进行继续注册!";
- szField1 = "编号";
- svEdit1 = localNum;
- //nResult = SdShowInfoList( szTitle, szMsg, list );
- //ListDestroy( list );
- nResult = SdShowDlgEdit1(szTitle, szMsg,szField1, svEdit1);
- //if (nResult = BACK) goto Dlg_SdLicense;
- if (nResult = BACK) goto Dlg_SdWelcome;
- Dlg_SdRegisterUserEx:
- szMsg = "请输入:用户名、公司名和注册号";
- szTitle = "xxxx系统";
- nResult = SdRegisterUserEx( szTitle, szMsg, szName, szCompany, szSerial );
- if (nResult = BACK) goto Dlg_SdShowInfoList;
- if (szSerial != checkString) then
- MessageBox( "注册码输入错误!", SEVERE);
- goto Dlg_SdRegisterUserEx;
- endif;
- Dlg_SdShowDlgEdit2:
- szTitle = "数据库信息";
- szMsg = "请输入数据库用户名和数据库密码:";
- szField1 = "用户名";
- szField2 = "密码";
- svEdit1 = "root";
- svEdit2 = "password";
- nResult = SdShowDlgEdit2(szTitle, szMsg,szField1,szField2, svEdit1,svEdit2);
- if (nResult = BACK) goto Dlg_SdRegisterUserEx;
- //SdShowMsg ("下面进行数据库初始化操作,请勿手动关闭弹出窗口!", TRUE);
- //Delay(2);
- //启动mysql
- LaunchAppAndWait("net","start mysql",WAIT);
- //LaunchAppAndWait("net","stop mysql",WAIT);
- //LaunchAppAndWait("C://Program Files//MySQL//MySQL Server 4.1//bin//mysql.exe"," -uroot -ppassword<" + SRCDIR ^ "test.sql",NOWAIT);
- // LaunchAppAndWait("C://Program Files//MySQL//MySQL Server 4.1//bin//mysql.exe"," -h localhost -u root -p password<" + SRCDIR ^ "test.sql",WAIT) ;
- //LaunchApp(WINDIR ^ "Notepad.exe",SRCDIR ^ "init.sql");
- //LaunchAppAndWait(SRCDIR ^ "sql.bat"," root password ",WAIT);
- ///LaunchAppAndWait("C://Program Files//MySQL//MySQL Server 4.1//bin//mysql.exe ","mysql -uroot -ppassword<" + SRCDIR ^ "test.sql",NOWAIT);
- nResult = XCopyFile(SRCDIR + "//sql.bat","c://xxx//",EXCLUDE_SUBDIR);
- nResult = XCopyFile(SRCDIR + "//init.sql","c://xxx//",EXCLUDE_SUBDIR);
- //if (LaunchAppAndWait(SRCDIR + "//sql.bat", " root password",WAIT) < 0) then
- //MessageBox ("数据库创建失败!请确您的系统中已安装MySQL 4.1.19./n如仍无法解决,请联系系统供应商!",SEVERE);
- //endif;
- //NumToStr(tmpCheckString,LaunchAppAndWait("c://xxx//sql.bat", " root password",WAIT));
- //MessageBox(tmpCheckString,SEVERE);
- if (LaunchAppAndWait("c://xxx//sql.bat", " " + svEdit1 + " " + svEdit2 + " ",WAIT) < 0) then
- MessageBox ("数据库创建失败!请确您的系统中已安装MySQL 4.1.19./n如仍无法解决,请联系系统供应商!",SEVERE);
- endif;
- //DeleteDir("c://xxx//",ALLCONTENTS); //删除这个临时目录
- DeleteFile("c://xxx//sql.bat");
- DeleteFile("c://xxx//init.sql");
- Dlg_SdAskDestPath:
- szTitle = "xxxx系统";
- szMsg = "请选择安装目录";
- nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );
- TARGETDIR = szDir;
- //if (nResult = BACK) goto Dlg_SdRegisterUserEx;
- if (nResult = BACK) goto Dlg_SdShowDlgEdit2;
- Dlg_SetupType:
- szTitle = "xxxx系统";
- szMsg = "请选择安装类型";
- nResult = SetupType ( szTitle , szMsg , "" , nSetupType , 0 );
- if (nResult = BACK) then
- goto Dlg_SdAskDestPath;
- else
- nSetupType = nResult;
- if (nSetupType != CUSTOM) then
- szTargetPath = TARGETDIR;
- nvSize = 0;
- ComponentCompareSizeRequired(MEDIA,szTargetPath,nvSize);
- if (nvSize != 0) then
- MessageBox( szSdStr_NotEnoughSpace, WARNING );
- goto Dlg_SetupType;
- endif;
- endif;
- endif;
- Dlg_SdComponentTree:
- if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SetupType;
- szTitle = "xxxx系统";
- szMsg = "";
- szTargetdir = TARGETDIR;
- szComponents = "";
- nLevel = 2;
- if (nSetupType = CUSTOM) then
- nResult = SdComponentTree(szTitle, szMsg, szTargetdir, szComponents, nLevel);
- if (nResult = BACK) goto Dlg_SetupType;
- endif;
- Dlg_ObjDialogs:
- nResult = ShowObjWizardPages(nResult);
- if (nResult = BACK) goto Dlg_SdComponentTree;
- Dlg_SdSelectFolder:
- szfolder = SHELL_OBJECT_FOLDER;
- szTitle = "xxxx系统";
- szMsg = "";
- nResult = SdSelectFolder( szTitle, szMsg, szfolder );
- SHELL_OBJECT_FOLDER = szfolder;
- if (nResult = BACK) goto Dlg_ObjDialogs;
- Dlg_SdStartCopy:
- szTitle = "xxxx系统";
- szMsg = "安装信息收集完毕,并且获得安装权限,下一步将进行文件拷贝。";
- listStartCopy = ListCreate( STRINGLIST );
- //The following is an example of how to add a string(szName) to a list(listStartCopy).
- //eg. ListAddString(listStartCopy,szName,AFTER);
- nResult = SdStartCopy( szTitle, szMsg, listStartCopy );
- ListDestroy(listStartCopy);
- if (nResult = BACK) goto Dlg_SdSelectFolder;
- // setup default status
- SetStatusWindow(0, "");
- Enable(STATUSEX);
- StatusUpdate(ON, 100);
- return 0;
- end;
- ///
- //
- // FUNCTION: OnMoving
- //
- // EVENT: Moving event is sent when file transfer is started as a result of
- // ComponentTransferData call, before any file transfer operations
- // are performed.
- //
- ///
- function OnMoving()
- string szAppPath;
- begin
- // Set LOGO Compliance Application Path
- // TO DO : if your application .exe is in a subfolder of TARGETDIR then add subfolder
- szAppPath = TARGETDIR;
- RegDBSetItem(REGDB_APPPATH, szAppPath);
- RegDBSetItem(REGDB_APPPATH_DEFAULT, szAppPath ^ @PRODUCT_KEY);
- end;
- // --- include script file section ---
- function OnEnd()
- // //string java_home, catalina_home, szKey, szEnv;
- // string szKey, szEnv, svClassPath;
- // string icon_dir, xml_dir,output_dir;
- // number nRegSize;
- // pointer pEnv;
- begin
- //
- // //catalina_home=TARGETDIR + "//tomcat5.0.30";
- // //java_home=TARGETDIR + "//j2sdk1.4.2_10";
- // szKey="Environment";
- // RegDBSetDefaultRoot(HKEY_CURRENT_USER);
- // //RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,java_home,-1);
- // //RegDBSetKeyValueEx(szKey,"CATALINA_HOME",REGDB_STRING,catalina_home,-1);
- //
- // //RegDBSetKeyValueEx(szKey,"CLASSPATH",REGDB_STRING,svClassPath,nRegSize);
- // GetEnvVar ("CLASSPATH", svClassPath);
- // //MessageBox(svClassPath,0);
- // svClassPath = svClassPath + "; " + "c://xxx//resc";
- // //MessageBox(svClassPath,0);
- // RegDBSetKeyValueEx(szKey,"CLASSPATH",REGDB_STRING,svClassPath,-1) ;
- // szEnv = "Environment";
- // pEnv = &szEnv;
- // //pEnv = AddressString(szEnv);
- // SendMessage(0xffff, 0x001A , 0, pEnv );
- //
- // //MessageBox("sssss",0);
- XCopyFile(SRCDIR ^ "xxx//icons//media//*.gif",TARGETDIR,EXCLUDE_SUBDIR);
- XCopyFile(SRCDIR ^ "xxx//icons//teacher//*.jpg",TARGETDIR,EXCLUDE_SUBDIR);
- CreateDir(TARGETDIR ^ "resc//");
- end;
- //
- 下面是一些设定tomcat或者jdk的环境变量的代码/非本系统/
- //
- function OnEnd()
- string java_home, catalina_home, szKey, szEnv;
- string icon_dir, xml_dir,output_dir;
- POINTER pEnv;
- begin
- catalina_home=TARGETDIR + "//tomcat5.0.30";
- java_home=TARGETDIR + "//j2sdk1.4.2_10";
- szKey="Environment";
- RegDBSetDefaultRoot(HKEY_CURRENT_USER);
- RegDBSetKeyValueEx(szKey,"JAVA_HOME",REGDB_STRING,java_home,-1);
- RegDBSetKeyValueEx(szKey,"CATALINA_HOME",REGDB_STRING,catalina_home,-1);
- szEnv = "Environment";
- pEnv = &szEnv;
- SendMessage (0xffff, 0x001A , 0, pEnv );
对应的 vb 注册码解码的核心程序(KeyGen.frm)如下:
- VERSION 5.00
- Begin VB.Form keyGen
- Appearance = 0 'Flat
- BackColor = &H80000001&
- BorderStyle = 5 'Sizable ToolWindow
- Caption = "**系统注册码生成器"
- ClientHeight = 1290
- ClientLeft = 60
- ClientTop = 330
- ClientWidth = 4545
- DrawMode = 1 'Blackness
- FillStyle = 0 'Solid
- LinkTopic = "Form1"
- MaxButton = 0 'False
- MinButton = 0 'False
- OLEDropMode = 1 'Manual
- ScaleHeight = 1290
- ScaleMode = 0 'User
- ScaleWidth = 4545
- ShowInTaskbar = 0 'False
- StartUpPosition = 1 '所有者中心
- Begin VB.CommandButton genButton
- Appearance = 0 'Flat
- BackColor = &H80000001&
- Caption = "生成"
- Height = 300
- Left = 3480
- MaskColor = &H80000001&
- Style = 1 'Graphical
- TabIndex = 4
- Top = 240
- UseMaskColor = -1 'True
- Width = 615
- End
- Begin VB.TextBox snText
- Appearance = 0 'Flat
- BackColor = &H80000001&
- Height = 300
- Left = 960
- Locked = -1 'True
- TabIndex = 3
- Top = 720
- Width = 3135
- End
- Begin VB.TextBox machineText
- Appearance = 0 'Flat
- BackColor = &H80000001&
- Height = 300
- Left = 960
- TabIndex = 2
- Top = 240
- Width = 2295
- End
- Begin VB.Label snLabel
- Alignment = 2 'Center
- Appearance = 0 'Flat
- BackColor = &H80000001&
- BackStyle = 0 'Transparent
- Caption = "注册码"
- ForeColor = &H80000008&
- Height = 255
- Left = 240
- TabIndex = 1
- Top = 840
- Width = 735
- End
- Begin VB.Label machineLabel
- Alignment = 2 'Center
- Appearance = 0 'Flat
- BackColor = &H80000001&
- BackStyle = 0 'Transparent
- Caption = "机器码"
- ForeColor = &H80000008&
- Height = 255
- Left = 240
- TabIndex = 0
- Top = 360
- Width = 735
- WordWrap = -1 'True
- End
- End
- Attribute VB_Name = "keyGen"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- Private Sub genButton_Click()
- Dim distNum As Double
- Dim intTmp As Double
- Dim mid As Long
- Dim strSN As String
- If (VBA.Trim(machineText) <> "") Then
- If (IsNumeric(VBA.Trim(machineText)) And VBA.Trim(machineText) > 135792468 And VBA.Trim(machineText) < 2139999999) Then
- distNum = machineText
- Else
- distNum = 123456789 + 135792468
- End If
- distNum = distNum - 135792468
- strSN = "B"
- intTmp = distNum
- mid = intTmp - Fix(intTmp / 100) * 100
- If mid = 0 Then
- strSN = strSN + "0X"
- Else
- strSN = strSN + VBA.Trim(Str(mid))
- End If
- strSN = strSN + "_"
- strSN = strSN + "K"
- intTmp = Fix(intTmp / 100)
- mid = intTmp - Fix(intTmp / 100) * 100
- If mid = 0 Then
- strSN = strSN + "0X"
- Else
- strSN = strSN + VBA.Trim(Str(mid))
- End If
- strSN = strSN + "_"
- strSN = strSN + "X"
- intTmp = Fix(intTmp / 100)
- mid = intTmp - Fix(intTmp / 100) * 100
- If mid = 0 Then
- strSN = strSN + "0X"
- Else
- strSN = strSN + VBA.Trim(Str(mid))
- End If
- strSN = strSN + "_"
- strSN = strSN + "T"
- intTmp = Fix(intTmp / 100)
- mid = intTmp - Fix(intTmp / 100) * 100
- If mid = 0 Then
- strSN = strSN + "0X"
- Else
- strSN = strSN + VBA.Trim(Str(mid))
- End If
- snText = strSN
- End If
- End Sub