zoukankan      html  css  js  c++  java
  • installshield中的installscript编程

    上一篇说道了InstallShield高速建立一个打包程序,如今说说InstallShield里面的installscript脚本。

    该文属于个人理解。參考一些相关文章。


    相关资料下载地址:http://download.csdn.net/detail/iamdale11/8104971

    该资料中包含InstallShield内部库函数以及一篇对dialog的理解


    首先,在上一篇的基础上,点击installation Designer.

    点击以下的InstallScript。


    先点击Setup.rul,然后例如以下图选择Before Move Data和OnFirstUIBefore.会在setup.rul文件里显示出上一篇文章中高速打包的程序源码。



    1、在安装过程中。须要先输入序列号,在自定义流程中加入例如以下代码:

    Dlg_SdRegisterUserEx://标签
        szMsg = "";//信息字段
        szTitle = "";//标题
        szSerial = ""; //序列号
        Disable (BACKBUTTON);//隐藏返回button
        nResult = SdRegisterUserEx(szTitle,szMsg, szName,szCompany, szSerial );//调用库函数显示对应的dialog

        //推断序列号是否正确
        if ( szSerial != '1111') then
              MessageBox("警告:输入序列号错误,请确认后重输!",SEVERE);
              goto Dlg_SdRegisterUserEx;    
         endif;   
        if (nResult = BACK) goto Dlg_SdWelcome;  

    2、在安装过程中。须要对安装程序进行对应的环境检測。在自己须要检測的地方加入例如以下代码:

     RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);//获取注冊表中的HKEY_LOCAL_MACHINE值。
        if (RegDBKeyExist ("SOFTWARE\Microsoft\NET Framework Setup\NDP\v4.0") < 0) then//推断对应的环境是否存在,这里是。

    NET 4.0
            MessageBox("未安装对应执行环境,正在进行安装",WARNING);
           // LaunchAppAndWait (SRCDISK^"1233456789.exe","", LAAW_OPTION_WAIT); //调用对应盘中的相关程序进行安装。


            goto Dlg_SdLicense2;
        else
             MessageBox("已安装对应的环境",WARNING);
        endif;

    3、自己定义dialog

    例如以下图点击dialog,然后在all Dialog上右键点击new dialog。创建自己定义的dialog。


    然后在Files中右键创建新的.rul文件对对应的dialog进行文件创建。


    如selectdlg.rul文件里代码例如以下:

    //宏定义相关量。注意,为了取得dialog窗口上的相关特征,须要将相关特征的control identifier中的值取出

    #define DLG_SELECTDLG "SelectDlg"
    #define GENGXIN 1322
    #define ANZHUANG 1323
    #define NEXTBTN 1
    #define BACKBTN 12

    prototype SelectDlg(BYREF STRING,BYREF STRING); //定义一个方法
    function SelectDlg( szTitle,szMsg)

    //定义相关变量

        number  nId, nResult,szGGZZ,szTest;
        HWND    hwndDlg;
        BOOL   bDone;
        string szGZ1,szGZ2,szTe;  
    begin
        // Specify a name to identify the custom dialog in this installation.
             
        // ensure general initialization is complete
        if( !bSdInit ) then
            SdInit();
        endif;

        //声明一个窗口
        nResult = EzDefineDialog(DLG_SELECTDLG, ISUSER, "SelectDlg", 0 );
         //MessageBox(szGZ,WARNING);
        // Initialize the indicator used to control the while loop.
        bDone = FALSE;

        // Loop until done.
        while (!bDone)

            // Display the dialog and return the next dialog event.
           nId = WaitOnDialog(DLG_SELECTDLG);  //显示一个窗口 
          
            // Respond to the event.
            switch(nId)
                case DLG_INIT:  //窗口初始化相关操作
                     CtrlSetState(DLG_SELECTDLG, ANZHUANG, BUTTON_CHECKED);
                     // No initialization is required for this example.
                case NEXTBTN://下一步button操作
                  //  getCtrlText();
                    if(CtrlGetState(DLG_SELECTDLG, GENGXIN) = BUTTON_CHECKED) then//推断radiobutton是否选中
                         nId=NEXT;
                    endif;
                    if(CtrlGetState(DLG_SELECTDLG, GENGXIN) = BUTTON_CHECKED) then 
                         nId=CUSTOM;
                         
                    endif;
                    bDone = TRUE;
                case BACK://返回button
                    nId    = BACK;
                    bDone = TRUE;
                case DLG_ERR:
                    SdError( -1, "Errrrrrrr" );
                    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;

        // Cleanup Dialog
        EndDialog( DLG_SELECTDLG );//结束窗口
        ReleaseDialog( DLG_SELECTDLG );//释放窗口
        SdUnInit();
        // record data produced by this dialog
        if( MODE = RECORDMODE ) then
        endif;
        return nId;
    end;

    4.文件复制操作

    VarSave (SRCTARGETDIR);    //保存系统变量值
              SRCDIR =Strjq;//Strjq是路径字符串,里面保存的是对应路径
              TARGETDIR=svDir; //svDir是路径字符串,里面保存的是对应路径
              nResult=CopyFile( "*.*", "*.*");  //复制操作,详细可參看库函数介绍
                    
     VarRestore (SRCTARGETDIR); // 恢复缺省的源目录和目标目录路径

    5.button验证函数,详细可參看资料中的自己定义dialog浅谈。

    function CheckInputValid(hwndDlg, bAllowNotSet)   
        STRING szInputAdd;
    begin
        if(bAllowNotSet) then
            _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 1);
            return 1;
        endif;
        CtrlGetText(DLG_GXDLG, SVDIR, szInputAdd);
        if(StrLength(szInputAdd) = 0) then
               _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 0);
               return 0;
        endif;
        _WinSubEnableControl(hwndDlg, SD_PBUT_CONTINUE, 1);
        return 1;

    end;



    我的感悟大致就是这些。请大家多多指出错误,相互讨论。








  • 相关阅读:
    ORA12560: TNS: 协议适配器错误的问题
    ibatis代码生成工具abator使用全过程
    DbHelper数据操作类
    眼睛有干涩、血丝、怕光,流泪,甚至红肿的现象吗
    Dot.Net代码生成器
    两分钟让你明白什么是ERP
    spring的b/s项目中配置log4j
    十面埋妇
    程序员发展的目标
    标准体重计算查询
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6907897.html
Copyright © 2011-2022 走看看