上一篇说道了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;

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

installshield中的installscript编程的更多相关文章

  1. INFO - InstallShield中的InstallScript工程Setup.exe /s的使用细节

    在InstallShield的各种工程类型中,Basic MSI工程Build出的安装包基于Windows Installer标准,所以默认就支持静默安装(至于如何静默安装,请自行补充相关知识).而对 ...

  2. 如何设置Installshield中 feature的选中状态

    原文:如何设置Installshield中 feature的选中状态 上一篇: 使用strtuts2的iterator标签循环输出二维数组之前一直有筒子问如何设置Installshield中 feat ...

  3. Java中的网络编程

    ​ Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...

  4. .Net中的并行编程-2.ConcurrentStack的实现与分析

    在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...

  5. .Net中的并行编程-3.ConcurrentQueue实现与分析

    在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...

  6. .Net中的并行编程-6.常用优化策略

                本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...

  7. .Net中的并行编程-5.流水线模型实战

    自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了 ...

  8. .Net中的并行编程-4.实现高性能异步队列

    上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...

  9. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

随机推荐

  1. [转]T4系列文章之3:T4语法的介绍

    本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html 因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管 ...

  2. Mac使用之常用快捷键

    正式工作了,公司配给了mac,很多命令跟windows有很大不同,为了自己更好的使用mac本,特此记录平时常用的快捷键命令. 1.复制.保存等:command+c/s等,与windows不同的是ctr ...

  3. FormsAuthentication权限管理

    通常我们在做访问权限管理的时候会把用户正确登录后的基本信息保存在Session中然后用户每次请求页面或接口数据的时候代上会话状态即能拿到Session中存储的基本信息Session的原理,也就是在服务 ...

  4. 2017-11-28 Html-浅谈如何正确给table加边框

    一般来说,给表格加边框都会出现不同的问题,以下是给表格加边框后展现比较好的方式 <style> table,table tr th, table tr td { border:1px so ...

  5. WordPress百度熊掌号页面改造(纯代码实现)

    一.粉丝关注改造 1.添加熊掌号ID声明 ID声明 <script src="//msite.baidu.com/sdk/c.js?appid=你的熊掌ID">< ...

  6. Python学习日记之忽略删除字符串空白

    使用Python自带的函数strip可以剔除字符串开头.结尾.两端的空白 使用场景:用户输入验证 strip : 去除字符串两端的空白 rstrip : 去除字符串末尾(右端)的空白 lstrip : ...

  7. Pycharm消除波浪线

    PyCharm使用了较为严格的PEP8检查规则,稍微有点错误就会出现波浪线提示.那么怎么消除这些波浪线呢?一个简单粗暴的方法就是:在编辑器的右下角有个小人形状的按钮,点开之后有个滚动条,将滚动条滑动到 ...

  8. JVM 参数含义

    JVM参数的含义 实例见实例分析 参数名称 含义 默认值   -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,J ...

  9. Windows下编译64位GSL

    GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)官方并没有提供编译好的Windows版本.首先要保证Windows是64位的 ...

  10. Vue.js 是什么

    Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.Vue 采用自底向上增量开发的设计. Vue 的核心库只关注视图层. 单页应用:Vue ...