杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2595|回复: 0

Installshield 创建自定义界面

[复制链接]
发表于 2017-3-27 16:57:27 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

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、通过工具栏设置需要的界面。

301615457626017.png
3、点击该Dialog,右侧属性框中Resource Identified必须是唯一的,一般新建时会自动生成。
301618554186876.png
4、每个控件在绘制时,也会自动生成Control Identified的值,用于在此后的代码中通过该ID获取相应的控件。
301620496529177.png
5、注意:有一些控件的Control Identified是固定的,例如“上一步”,“下一步”等。
301627079968823.png
上述红框标识的必须和其他的一样,具体的值可以打开其他的Dialog查看,最直接的办法即打开其他的Dialog直接复制粘贴这几个控件即可。
6、绘制完界面之后,就要开始编写相对应的事件脚步了,在Installation Desigenr->Behavior and Logic->InstallScript,在右侧InstallScript的Files中右击创建一个customsetinfo.rul文件编写脚步事件。
  1. #define DLG_NAME "CustomSetInfo"    //Dialog名称
  2. #define DLG_RESOURCEID 22222        //Dialog的Resource Identified
  3. #define EDIT_BANKPORT  1306         //端口输入框控件Control Identified
  4. #define EDIT_MYSQLPWD  1309         //密码输入框Control Identified
  5. #define EDIT_BANKCLOSEPORT 1311     //关闭端口输入框控件Control Identified
  6.                                                               
  7. //声明函数                                                              
  8. prototype SetInfo(BYREF STRING,BYREF STRING,BYREF STRING,BYREF STRING);
  9. //根据用户的输入判断“下一步”是否可操作
  10. prototype EnableNextButton(INT,INT,BYREF STRING,BYREF STRING,BYREF STRING);
  11. function SetInfo(szMsg,svPort,svClosePort,svPwd)
  12.     STRING  szDlg, szTemp;
  13.     BOOL    bDone;
  14.     NUMBER  nId, nMessage, nTemp, nSdDialog, nSdCustomRegisterUserEx;
  15.     HWND    hwndDlg, hwndControl;
  16. begin  
  17.     szDlg = DLG_NAME;
  18.     nSdDialog = DLG_RESOURCEID;
  19.    
  20.     // ensure general initialization is complete
  21.    if (!bSdInit) then
  22.       SdInit( );
  23.    endif;
  24.    //初始化Dialog
  25.    if (EzDefineDialog( szDlg, "", "", DLG_RESOURCEID ) = DLG_ERR) then
  26.         return -1;
  27.    endif;
  28.    // Loop in dialog until the user selects a standard button
  29.    bDone = FALSE;
  30.    while (!bDone)
  31.          //Dialog界面中每一个操作均会触发该事件,返回控件的Control Identified
  32.       nId = WaitOnDialog( szDlg );
  33.       switch(nId)
  34.       case DLG_INIT://第一次打开该界面时执行
  35.            if( szMsg != "" ) then
  36.                SdSetStatic( szDlg, SD_STA_MSG, szMsg );
  37.            endif;                                 
  38.            //将参数设置到控件中,即显示默认值
  39.            CtrlSetText(szDlg,EDIT_BANKPORT,svPort);
  40.            CtrlSetText(szDlg,EDIT_BANKCLOSEPORT,svClosePort);
  41.            CtrlSetText(szDlg,EDIT_MYSQLPWD,svPwd);
  42.            hwndDlg = CmdGetHwndDlg( szDlg );
  43.            SdGeneralInit( szDlg, hwndDlg, STYLE_BOLD, szSdProduct );
  44.            EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
  45.            
  46.       case EDIT_BANKPORT:
  47.            nMessage = CtrlGetSubCommand( szDlg );
  48.            if( nMessage = EDITBOX_CHANGE ) then
  49.                CtrlGetText( szDlg, EDIT_BANKPORT, svPort );
  50.            endif;
  51.            EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
  52.            
  53.       case EDIT_BANKCLOSEPORT:
  54.            nMessage = CtrlGetSubCommand( szDlg );
  55.            if( nMessage = EDITBOX_CHANGE ) then
  56.                CtrlGetText( szDlg, EDIT_BANKCLOSEPORT, svClosePort );
  57.            endif;
  58.            EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);  
  59.            
  60.       case EDIT_MYSQLPWD:
  61.            nMessage = CtrlGetSubCommand( szDlg );
  62.            if( nMessage = EDITBOX_CHANGE ) then
  63.                CtrlGetText( szDlg, EDIT_MYSQLPWD, svPwd );
  64.            endif;
  65.           EnableNextButton( hwndDlg, NEXT, svPort,svClosePort,svPwd);
  66.          
  67.       case NEXT:
  68.            nId    = NEXT;
  69.            bDone  = TRUE;

  70.       case BACK:
  71.            nId    = BACK;
  72.            bDone  = TRUE;

  73.       case DLG_ERR:
  74.            SdError( -1, "CustomSetInfo" );
  75.            nId    = -1;
  76.            bDone  = TRUE;

  77.       case DLG_CLOSE:
  78.            SdCloseDlg( hwndDlg, nId, bDone );

  79.       default:
  80.            // check standard handling
  81.            if (SdIsStdButton( nId ) && SdDoStdButton( nId )) then
  82.                bDone = TRUE;
  83.            endif;
  84.       endswitch;

  85.    endwhile;

  86.    EndDialog( szDlg );
  87.    ReleaseDialog( szDlg );

  88.    SdUnInit( );

  89.    return nId;

  90. end;

  91. function EnableNextButton(hwndDlg,nControlID, svPort,svClosePort, svPwd )
  92.     HWND hwndItem;
  93.     NUMBER nVar;
  94.     BOOL bsuccess;
  95.     begin
  96.        hwndItem = CtrlGetDlgItem( "", hwndDlg, nControlID );
  97.    
  98.        if (!IsWindow(hwndItem)) then return FALSE; endif;
  99.    
  100.        // trim trailing spaces from each field
  101.        StrTrim( svPort );
  102.        StrTrim( svPwd );
  103.        StrTrim(svClosePort);
  104.        bsuccess=TRUE;
  105.        // if any of the fields are empty, disable the Next button
  106.        if(svPwd = "" || svPort = ""||svClosePort="" ) then
  107.           bsuccess=FALSE;
  108.        else
  109.              //the svPort max length is 5,and must be number
  110.           if((StrToNum(nVar,svPort)<0)||(StrToNum(nVar,svClosePort)<0)) then
  111.                   bsuccess=FALSE;
  112.           else  
  113.                   if((StrLength(svPort)>5)||(StrLength(svClosePort)>5)) then
  114.                       bsuccess=FALSE;  
  115.                   else if(svPort= svClosePort) then
  116.                       bsuccess=FALSE;  
  117.                       endif;
  118.                   endif;
  119.           endif;
  120.           //the svPwd max length is 8
  121.           if(StrLength(svPwd)>8) then
  122.                   bsuccess=FALSE;
  123.           endif;   
  124.        endif;
  125.       EnableWindow( hwndItem, bsuccess );
  126. end;

  127. CustomSetInfo
复制代码
7、在Setup.Rul中使用
  1. // Included header files ----------------------------------------------------   
  2. STRING szBankPort,szBankClosePort,szMysqlPwd;
  3. #include "ifx.h"
  4. #include "customsetinfo.rul"  //引入文件

  5. // OnFirstUIBefore
  6. //
  7. // The OnFirstUIBefore event is called by the framework when the setup is
  8. // running in first install mode. By default this event displays UI allowing
  9. // the end user to specify installation parameters.
  10. //---------------------------------------------------------------------------
  11. function OnFirstUIBefore()
  12.     NUMBER nResult, nSetupType, nvSize, nUser;
  13.     STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
  14.     STRING szLicenseFile;
  15.     BOOL   bCustom, bIgnore1, bIgnore2;
  16.     STRING svResult;
  17.     NUMBER ISsucc,svSize,svType;
  18.     STRING mysqlpath,mysqlkey,jdkkey;   
  19. begin   
  20.    
  21.     nResult = 0;
  22.     nSetupType = CUSTOM;   
  23.         
  24. Dlg_SdWelcome:
  25.     szTitle = "";
  26.     szMsg   = "";
  27.     nResult = SdWelcome(szTitle, szMsg);
  28.     if (nResult = BACK) goto Dlg_SdWelcome;      
  29.     szTitle   = "";
  30.     svName    = "";
  31.     svCompany = "";     

  32. Dlg_SdAskDestPath:        
  33.     nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);
  34.     if (nResult = BACK) goto Dlg_SdWelcome;
  35.                                                    
  36. Dlg_SetInfo:  
  37.     szMsg   = "";
  38.     szBankPort="8101";
  39.     szBankClosePort="8102";
  40.     szMysqlPwd="";
  41.     nResult=SetInfo(szMsg,szBankPort,szBankClosePort,szMysqlPwd); //使用新创建的界面
  42.     if(nResult=BACK) goto Dlg_SdAskDestPath;  
  43.                                             
  44. Dlg_SdStartCopy:
  45.     szTitle = "";
  46.     szMsg   = "";
  47.     nResult = SdStartCopy2( szTitle, szMsg );            
  48.    
  49.     if (nResult = BACK) then
  50.        goto Dlg_SetInfo;
  51.     endif;

  52.     // Added in IS 2009 - Set appropriate StatusEx static text.
  53.     SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );

  54.     // setup default status
  55.     Enable(STATUSEX);

  56.     return 0;
  57. end;

  58. Setup
复制代码
8、注册表操作
  1. //向注册表中添加本产品的安装路径和版本
  2.     svSize=-1;
  3.     svType=REGDB_STRING;   
  4.     RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
  5.     bankKey="SOFTWARE\\UFGOVBank";
  6.     if(RegDBKeyExist(bankKey)<0) then
  7.         RegDBCreateKeyEx(bankKey,"");
  8.     endif;
  9.     location = TARGETDIR;
  10.     currentVersion = IFX_PRODUCT_VERSION;
  11.     RegDBSetKeyValueEx ( bankKey, "location", svType, location, svSize );
  12.     RegDBSetKeyValueEx ( bankKey, "CurrentVersion", svType, currentVersion, svSize );
  13.    

  14.     //删除注册表信息
  15.     RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
  16.     bankKey="SOFTWARE\\UFGOVBank\";   
  17.     RegDBDeleteKey(bankKey);

  18. 注册表操作
复制代码
9、创建“卸载快捷方式”
  1. //创建卸载快捷键
  2.     szfilename = UNINSTALL_STRING +" /UNINSTALL";
  3.     nresult = StrFind(szfilename,".exe");
  4.     if nresult >=0 then
  5.         StrSub(szmsg1,szfilename,0,nresult + 4);
  6.         StrSub(szmsg2,szfilename,nresult + 4,200);
  7.         LongPathToQuote(szmsg1, FALSE );
  8.         LongPathToQuote(szmsg2, FALSE );
  9.         szfilename = """+szmsg1+"""+szmsg2;
  10.     endif;
  11.     AddFolderIcon(FOLDER_PROGRAMS^"产品1","卸载产品1",szfilename,WINDIR,"",0,"",REPLACE);   



  12. //删除快捷方式
  13.     DeleteProgramFolder(FOLDER_PROGRAMS^"产品1");
  14.    

  15. 卸载快捷方式
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-14 09:52 , Processed in 0.111900 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表