InstallShield学习笔记三:脚本(1)

摘要:
这里InstallSrcipt说明,记录使用过程中遇到的问题。所以使用SdLicense2Ex;3.选择安装路径在默认情况下,安装路径在选择安装模式之后。=CUSTOM))gotoDlg_SdAskDestPath2;szTitle="";szMsg="";szFeatures="";nLevel=2;ifthen//{{IS_SCRIPT_TAGnResult=SdFeatureTree;//}}IS_SCRIPT_TAGifgotoDlg_SetupType2;endif;注意:修改时要注意goto的路径,如果配置不会,会出现点击“上一步”或者“下一步”是页面错误。

1.工程说明

在实际应用中,有 InstallSrcipt MSI 和 InstallSrcipt 这两个工程最常用,基本上脚本是可以共用的,

但是有个不同:

在 InstallSrcipt MSI 中,安装路径可以使用 INSTALLDIR 和 TARGETDIR,

而在 InstallSrcipt 中,只能使用TARGETDIR。

这里 InstallSrcipt 说明,记录使用过程中遇到的问题。

2.License选择

在 OnFirstUIBefore中,已经为工程自定义了许可文件license页面,脚本代码如下::

Dlg_SdLicense2:
    szTitle = "";
    szOpt1 = "";
    szOpt2 = "";
    //{{IS_SCRIPT_TAG(License_File_Path)
    szLicenseFile = SUPPORTDIR ^ "License.rtf";
    //}}IS_SCRIPT_TAG(License_File_Path)
    //{{IS_SCRIPT_TAG(Dlg_SdLicense2)
    nResult =SdLicense2Ex( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted, TRUE );
    //}}IS_SCRIPT_TAG(Dlg_SdLicense2)
    if (nResult =BACK) then
        gotoDlg_SdWelcome;
    elsebLicenseAccepted =TRUE;
    endif;

这里使用的是 SdLicense2Ex( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted, TRUE ),

在实际应用过程中,用到许可文件是txt格式,在设置参数时,需要将最后一个参数设置为FlALSE,否则许可文件可能会显示不全。

所以使用 SdLicense2Ex( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted, FALSE); (具体每个参数的含义可以查看帮组文档)

3.选择安装路径

在默认情况下,安装路径在选择安装模式之后。

如果选择“全部”,则会安装在默认路径,即C:Program FilesXXX下

如果选择“定制”,这会提示安装路径

考虑看到这个体验不好,可以将路径选择提前,具体脚本代码如下:

Dlg_SdAskDestPath2:
    szTitle = "";
    szMsg = "";
//{{IS_SCRIPT_TAG(Dlg_SdAskDestPath2)    
    nResult =SdAskDestPath2( szTitle, szMsg, szDir );
    //}}IS_SCRIPT_TAG(Dlg_SdAskDestPath2)
    TARGETDIR =szDir;
if (nResult = BACK) goto Dlg_SdRegisterUser; //注意这里修改后,点击“上一步”时,应该跳转回输入用户信息页面
Dlg_SetupType2:   
    szTitle = "";
    szMsg = "";
    nResult =CUSTOM;
    //{{IS_SCRIPT_TAG(Dlg_SetupType2)    
    nResult = SetupType2( szTitle, szMsg, "", nSetupType, 0);
    //}}IS_SCRIPT_TAG(Dlg_SetupType2)
    if (nResult =BACK) then
        goto Dlg_SdAskDestPath2; //在选择安装模式,点击“上一步”,应该跳回安装路径选择界面
    elsenSetupType =nResult;
        if (nSetupType !=CUSTOM) then
            szTargetPath =TARGETDIR;
            nSize = 0;
            FeatureCompareSizeRequired( MEDIA, szTargetPath, nSize );
            if (nSize != 0) then      
                MessageBox( szSdStr_NotEnoughSpace, WARNING );
                goto Dlg_SQLServer; //选择的不是 CUSTOM  即定制,点击“下一步”, 跳转到安装数据库页面 
endif;
        //以下是新增部分,选择的是 CUSTOM  即定制,点击“下一步”, 需要跳转到选择组件页面  
         else
            gotoDlg_SdFeatureTree;
        endif;        
    endif;


Dlg_SdFeatureTree: 
    if ((nResult = BACK) && (nSetupType != CUSTOM)) gotoDlg_SdAskDestPath2;
    szTitle = "";
    szMsg = "";
    szFeatures = "";
    nLevel = 2;
    if (nSetupType =CUSTOM) then
        //{{IS_SCRIPT_TAG(Dlg_SdFeatureTree)    
        nResult =SdFeatureTree( szTitle, szMsg, TARGETDIR, szFeatures, nLevel );
        //}}IS_SCRIPT_TAG(Dlg_SdFeatureTree)
        if (nResult = BACK) gotoDlg_SetupType2;  
    endif;

注意:修改时要注意goto的路径,如果配置不会,会出现点击“上一步”或者“下一步”是页面错误。

4.安装组件选择

说明:InstallShiled 在自带有记忆功能。在当前页面选择参数后,如路径,组件等,在没有点击“下一步的”时候,这些参数不会被修改,

此时点击“上一步”,在点击“下一步”后,还是会显示默认值。

需求:选择安装组件时,当组件已经选择,在点击“上一步”查看前面的数据,再返回到当前页面,需要保证保证当前的组件还是选择状态。

思路:在SdFeatureTree设置一个全局变量,用来标记组件选择状态。

使用FeatureIsItemSelected ( szFeatureSource, szFeature );获取组件是否选上;

使用FeatureSelectItem ( szFeatureSource, szFeature, bSelect );设置组件状态

(1)在Setup.rul选择“Dailog Source”,选择SdFeatureTree,可以获取到选择组件代码。

image

(2)定义全局变量

//===========================================================================
//
//File Name:    Setup.rul
//
//Description:  Blank setup main script file
//
//Comments:     Blank setup is an empty setup project. If you want to
//create a new project via. step-by step instructions use the
//Project Assistant.
//
//===========================================================================

//Included header files ----------------------------------------------------
#include "ifx.h"

//全局变量
BOOL bSelectFeature1, bSelectFeature2;

(3)在SdFeatureTree(szTitle, szMsg, svDir, szComponents, nLevel)设置状态。

caseSD_TREE_COMPONENT: 条件下增加,因为当我们选择组件时,都会触发这个事件。

加入一下两段代码

bSelectFeature1 = FeatureIsItemSelected(MEDIA, "DefaultFeature\NewFeature1");

bSelectFeature2 = FeatureIsItemSelected(MEDIA, "DefaultFeature\NewFeature2");

注意:”DefaultFeature\NewFeature1”这里取得名称是新增Feature的名称,不是DisplayName。

caseSD_TREE_COMPONENT:

            nTNCode =CtrlGetNotificationCode(szDlg);
            NumToStr(sTN, nTNCode);

            if(nTNCode = -402) then //TVN_SELCHANGE
                if(GetSelectedTreeComponent(nComponentView, strComp) = 0) then
                    ComponentGetData(MEDIA, strComp, COMPONENT_FIELD_DESCRIPTION, n, strDisplayName);
                    SetWindowText(CtrlGetDlgItem("", hwndDlg, SD_STA_MSG2), strDisplayName);
                endif;
            endif;

            //set required size
ISRT._ComponentGetTotalCostEx(__hContext, MEDIA, svDir, strReqSize, nUnitUsed);
            if ((nUnitUsed != KBYTES) && (nUnitUsed != MBYTES) && (nUnitUsed !=GBYTES)) then
                nUnitUsed =MBYTES;
            endif;

            if (StrLengthChars(strReqSize) = 0) then strReqSize = "0.00"; endif;
            strReqSize = strReqSize + " " +StrConvertSizeUnit( nUnitUsed );
            Sprintf(strTempCtrlTxt, strReqFormat, strReqSize,strDrive);
            SetWindowText( hwndReqCtrl, strTempCtrlTxt);

            //set Available size
            if(StrLength(svDir) >0) then
                ISRT._GetDiskSpaceExEx(svDir,strAvailSize,nUnitUsed,TRUE,TRUE);
                if (StrLengthChars(strAvailSize) = 0) then strAvailSize = "0.00"; endif;
                strAvailSize = strAvailSize + " " +StrConvertSizeUnit( nUnitUsed );
                Sprintf(strTempCtrlTxt, strAvailFormat, strAvailSize,strDrive);
                SetWindowText(hwndAvailCtrl, strTempCtrlTxt);
            endif;
            
            //设置选择状态
            bSelectFeature1 = FeatureIsItemSelected(MEDIA, "DefaultFeature\NewFeature1");bSelectFeature2 = FeatureIsItemSelected(MEDIA, "DefaultFeature\NewFeature2");

            bDone  = FALSE;

(4)在Dlg_SdFeatureTree: 中对应增加配置:

FeatureSelectItem(MEDIA, "DefaultFeature\NewFeature1", bSelectFeature1);

FeatureSelectItem(MEDIA, "DefaultFeature\NewFeature2", bSelectFeature2);

技巧:注意到”DefaultFeature\NewFeature1“和 ”DefaultFeature\NewFeature2“ 这两个第(3)步中的一样,可以定义全局的值,使用#define,

#define FEATURE1 "DefaultFeature\NewFeature1"
#define FEATURE2 "DefaultFeature\NewFeature2"

代码:

Dlg_SdFeatureTree: 
    if ((nResult = BACK) && (nSetupType != CUSTOM)) gotoDlg_SdAskDestPath2;
    szTitle = "";
    szMsg = "";
    szFeatures = "";
    nLevel = 2;
    if (nSetupType =CUSTOM) then

        FeatureSelectItem(MEDIA, "DefaultFeature\NewFeature1", bSelectFeature1);
        FeatureSelectItem(MEDIA, "DefaultFeature\NewFeature2", bSelectFeature2);
        
        //或者
         //FeatureSelectItem(MEDIA, FEATURE1, bSelectFeature1);
        //FeatureSelectItem(MEDIA, FEATURE2, bSelectFeature2);
        
        //{{IS_SCRIPT_TAG(Dlg_SdFeatureTree)    
        nResult =SdFeatureTree( szTitle, szMsg, TARGETDIR, szFeatures, nLevel );
        //}}IS_SCRIPT_TAG(Dlg_SdFeatureTree)
        if (nResult = BACK) gotoDlg_SetupType2;  
    endif;

免责声明:文章转载自《InstallShield学习笔记三:脚本(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue2.0 之列表渲染-v-forHttp协议、线程、线程池下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

win10 优化批处理

@ECHOoffECHO关闭自动修复bcdedit/setrecoveryenabledNOecho完成ECHO关闭WindowsDefenderregadd“HKEY_LOCAL_MACHINESOFTWARE策略MicrosoftWindowsDefender”/v“DisableAntiSpyware”/d1/tReG_ DWORD/fcho完成ECH...

Centos-修改文件访问和修改时间-touch

触摸如果文件存在,请更改文件的访问时间和修改时间。如果不存在,请创建一个空的文件相关选项。a将文件访问时间更改为当前系统时间。m将文件修改时间更改为当前系统时间。c如果文件不存在,请不要创建它。d不提示。d指定日期和时间。格式为Y-m-dH:m:S-r递归修改目录下的所有文件和内容...

用arduino做一个智能垃圾桶

这些天我几乎很忙。我有一些时间继续打扰我的arduino。上一次我从TB购买arduino套件时,有一个人体热能感应模块,用于感应人体接近信号。今天我们用这个做一个简单的智能垃圾桶。要实现的功能是:当有人靠近时,垃圾可以自动打开盖子,当人离开时,盖子可以自动关闭。1、 所需材料和工具:1 Arduino SCM我使用Arduino Nano 2人体热能传感模...

当微信小程序遇到AR(二)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动......通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。注册地址=˃注册成功之后,需要下载微信小程序开发工具。下载地址=˃目前笔者的开发环境是:Windows10下载的微信小程序版本为:RCv1.0.2.1909111 打开,微信开发者工具之后,会看到如下的页面。...

【01】如何在XMind中排列自由主题

如何在XMind中安排免费主题。在XMind思维导图软件中,用户可以根据需要添加免费主题。然而,由于自由主题的灵活性,它并不整洁,与需要控制界面有序排列的用户相比,这会造成一定的麻烦。首先选择要组织的所有免费主题,单击,然后在下拉框中选择以安排免费主题。有六种排列方式:左对齐、垂直居中、右对齐、顶部对齐、水平居中和底部对齐。...

WritableWorkbook 详细用例 (转)

1WritableWorkbookworkbook=工作簿.createWorkbook(newFile(“d:\test.xls”));1Workbookwb=工作簿.getWorkbook(newFile(“src\test\test.xls”));...