正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Installshield MSI Project项目。 需求: 在安装过程中需要一个界面让用户输入一些特定的信息,但installshield自带的界面无法满足要求,需要我们自己新建一个界面。 原理: 1、在Installation Desigenr->User Interface->Dialog中,我们可以新建Dialog即界面,每个Dialog对应一个Resource identified即ID,该Resource ID是唯一的,用以得到对应的Dialog界面,即你以后在InstallScript中写代码时,即通过该Resource id获取该界面。 2、Dialog界面上的控件,即输入框,按钮等,都有一个Control identified与之定义,该ID也是为了获取该界面上的控件,此后便通过ID获取相应的控件。 3、界面设计好以后,需要编写相对应的.rul结尾的script文件,用于编写界面上不同控件的事件,例如:校验密码等。 4、在Setup.Rul中适当的位置调用该界面即可。 实例: Installshield安装文件中自带了一个实例,在安装路径:$InstallShield0SamplesInstallScript下有一个Serial Number Validation Sample Project文件夹,用InstallShield打开Serial Number Validation Sample Project.ism即可,该例子主要用于验证用户输入的序列号,正确即可点击下一步,否则下一步不允许点,在此,我另建一个Dialog,自带的实例,自行查看。 1、点击Installation Desigenr->User Interface->Dialog,在All Dialog中右击,点击NEW Dialog,创建一个新的界面,取名为CustomSetInfo。 2、通过工具栏设置需要的界面。
3、点击该Dialog,右侧属性框中Resource Identified必须是唯一的,一般新建时会自动生成。 4、每个控件在绘制时,也会自动生成Control Identified的值,用于在此后的代码中通过该ID获取相应的控件。 5、注意:有一些控件的Control Identified是固定的,例如“上一步”,“下一步”等。 上述红框标识的必须和其他的一样,具体的值可以打开其他的Dialog查看,最直接的办法即打开其他的Dialog直接复制粘贴这几个控件即可。 6、绘制完界面之后,就要开始编写相对应的事件脚步了,在Installation Desigenr->Behavior and Logic->InstallScript,在右侧InstallScript的Files中右击创建一个customsetinfo.rul文件编写脚步事件。 - #define DLG_NAME "CustomSetInfo" //Dialog名称
- #define DLG_RESOURCEID 22222 //Dialog的Resource Identified
- #define EDIT_BANKPORT 1306 //端口输入框控件Control Identified
- #define EDIT_MYSQLPWD 1309 //密码输入框Control Identified
- #define EDIT_BANKCLOSEPORT 1311 //关闭端口输入框控件Control Identified
-
- //声明函数
- prototype SetInfo(BYREF STRING,BYREF STRING,BYREF STRING,BYREF STRING);
- //根据用户的输入判断“下一步”是否可操作
- prototype EnableNextButton(INT,INT,BYREF STRING,BYREF STRING,BYREF STRING);
- function SetInfo(szMsg,svPort,svClosePort,svPwd)
- STRING szDlg, szTemp;
- BOOL bDone;
- NUMBER nId, nMessage, nTemp, nSdDialog, nSdCustomRegisterUserEx;
- HWND hwndDlg, hwndControl;
- begin
- szDlg = DLG_NAME;
- nSdDialog = DLG_RESOURCEID;
-
- // ensure general initialization is complete
- if (!bSdInit) then
- SdInit( );
- endif;
- //初始化Dialog
- if (EzDefineDialog( szDlg, "", "", DLG_RESOURCEID ) = DLG_ERR) then
- return -1;
- endif;
- // Loop in dialog until the user selects a standard button
- bDone = FALSE;
- while (!bDone)
- //Dialog界面中每一个操作均会触发该事件,返回控件的Control Identified
- nId = WaitOnDialog( szDlg );
- switch(nId)
- case DLG_INIT://第一次打开该界面时执行
- if( szMsg != "" ) then
- SdSetStatic( szDlg, SD_STA_MSG, szMsg );
- endif;
- //将参数设置到控件中,即显示默认值
- CtrlSetText(szDlg,EDIT_BANKPORT,svPort);
- CtrlSetText(szDlg,EDIT_BANKCLOSEPORT,svClosePort);
- CtrlSetText(szDlg,EDIT_MYSQLPWD,svPwd);
- hwndDlg = CmdGetHwndDlg( szDlg );
- SdGeneralInit( szDlg, hwndDlg, STYLE_BOLD, szSdProduct );
- EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
-
- case EDIT_BANKPORT:
- nMessage = CtrlGetSubCommand( szDlg );
- if( nMessage = EDITBOX_CHANGE ) then
- CtrlGetText( szDlg, EDIT_BANKPORT, svPort );
- endif;
- EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
-
- case EDIT_BANKCLOSEPORT:
- nMessage = CtrlGetSubCommand( szDlg );
- if( nMessage = EDITBOX_CHANGE ) then
- CtrlGetText( szDlg, EDIT_BANKCLOSEPORT, svClosePort );
- endif;
- EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
-
- case EDIT_MYSQLPWD:
- nMessage = CtrlGetSubCommand( szDlg );
- if( nMessage = EDITBOX_CHANGE ) then
- CtrlGetText( szDlg, EDIT_MYSQLPWD, svPwd );
- endif;
- EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
-
- case NEXT:
- nId = NEXT;
- bDone = TRUE;
- case BACK:
- nId = BACK;
- bDone = TRUE;
- case DLG_ERR:
- SdError( -1, "CustomSetInfo" );
- nId = -1;
- bDone = TRUE;
- case DLG_CLOSE:
- SdCloseDlg( hwndDlg, nId, bDone );
- default:
- // check standard handling
- if (SdIsStdButton( nId ) && SdDoStdButton( nId )) then
- bDone = TRUE;
- endif;
- endswitch;
- endwhile;
- EndDialog( szDlg );
- ReleaseDialog( szDlg );
- SdUnInit( );
- return nId;
- end;
- function EnableNextButton(hwndDlg,nControlID, svPort,svClosePort, svPwd )
- HWND hwndItem;
- NUMBER nVar;
- BOOL bsuccess;
- begin
- hwndItem = CtrlGetDlgItem( "", hwndDlg, nControlID );
-
- if (!IsWindow(hwndItem)) then return FALSE; endif;
-
- // trim trailing spaces from each field
- StrTrim( svPort );
- StrTrim( svPwd );
- StrTrim(svClosePort);
- bsuccess=TRUE;
- // if any of the fields are empty, disable the Next button
- if(svPwd = "" || svPort = ""||svClosePort="" ) then
- bsuccess=FALSE;
- else
- //the svPort max length is 5,and must be number
- if((StrToNum(nVar,svPort)<0)||(StrToNum(nVar,svClosePort)<0)) then
- bsuccess=FALSE;
- else
- if((StrLength(svPort)>5)||(StrLength(svClosePort)>5)) then
- bsuccess=FALSE;
- else if(svPort= svClosePort) then
- bsuccess=FALSE;
- endif;
- endif;
- endif;
- //the svPwd max length is 8
- if(StrLength(svPwd)>8) then
- bsuccess=FALSE;
- endif;
- endif;
- EnableWindow( hwndItem, bsuccess );
- end;
- CustomSetInfo
复制代码 7、在Setup.Rul中使用
- // Included header files ----------------------------------------------------
- STRING szBankPort,szBankClosePort,szMysqlPwd;
- #include "ifx.h"
- #include "customsetinfo.rul" //引入文件
- // OnFirstUIBefore
- //
- // The OnFirstUIBefore event is called by the framework when the setup is
- // running in first install mode. By default this event displays UI allowing
- // the end user to specify installation parameters.
- //---------------------------------------------------------------------------
- function OnFirstUIBefore()
- NUMBER nResult, nSetupType, nvSize, nUser;
- STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
- STRING szLicenseFile;
- BOOL bCustom, bIgnore1, bIgnore2;
- STRING svResult;
- NUMBER ISsucc,svSize,svType;
- STRING mysqlpath,mysqlkey,jdkkey;
- begin
-
- nResult = 0;
- nSetupType = CUSTOM;
-
- Dlg_SdWelcome:
- szTitle = "";
- szMsg = "";
- nResult = SdWelcome(szTitle, szMsg);
- if (nResult = BACK) goto Dlg_SdWelcome;
- szTitle = "";
- svName = "";
- svCompany = "";
- Dlg_SdAskDestPath:
- nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);
- if (nResult = BACK) goto Dlg_SdWelcome;
-
- Dlg_SetInfo:
- szMsg = "";
- szBankPort="8101";
- szBankClosePort="8102";
- szMysqlPwd="";
- nResult=SetInfo(szMsg,szBankPort,szBankClosePort,szMysqlPwd); //使用新创建的界面
- if(nResult=BACK) goto Dlg_SdAskDestPath;
-
- Dlg_SdStartCopy:
- szTitle = "";
- szMsg = "";
- nResult = SdStartCopy2( szTitle, szMsg );
-
- if (nResult = BACK) then
- goto Dlg_SetInfo;
- endif;
- // Added in IS 2009 - Set appropriate StatusEx static text.
- SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
- // setup default status
- Enable(STATUSEX);
-
- return 0;
- end;
- Setup
复制代码 8、注册表操作
- //向注册表中添加本产品的安装路径和版本
- svSize=-1;
- svType=REGDB_STRING;
- RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
- bankKey="SOFTWARE\\UFGOVBank";
- if(RegDBKeyExist(bankKey)<0) then
- RegDBCreateKeyEx(bankKey,"");
- endif;
- location = TARGETDIR;
- currentVersion = IFX_PRODUCT_VERSION;
- RegDBSetKeyValueEx ( bankKey, "location", svType, location, svSize );
- RegDBSetKeyValueEx ( bankKey, "CurrentVersion", svType, currentVersion, svSize );
-
- //删除注册表信息
- RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
- bankKey="SOFTWARE\\UFGOVBank\";
- RegDBDeleteKey(bankKey);
- 注册表操作
复制代码 9、创建“卸载快捷方式”
- //创建卸载快捷键
- szfilename = UNINSTALL_STRING +" /UNINSTALL";
- nresult = StrFind(szfilename,".exe");
- if nresult >=0 then
- StrSub(szmsg1,szfilename,0,nresult + 4);
- StrSub(szmsg2,szfilename,nresult + 4,200);
- LongPathToQuote(szmsg1, FALSE );
- LongPathToQuote(szmsg2, FALSE );
- szfilename = """+szmsg1+"""+szmsg2;
- endif;
- AddFolderIcon(FOLDER_PROGRAMS^"产品1","卸载产品1",szfilename,WINDIR,"",0,"",REPLACE);
- //删除快捷方式
- DeleteProgramFolder(FOLDER_PROGRAMS^"产品1");
-
- 卸载快捷方式
复制代码
|