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;

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

时间: 2024-10-17 19:46:44

installshield中的installscript编程的相关文章

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

原文:如何设置Installshield中 feature的选中状态 上一篇: 使用strtuts2的iterator标签循环输出二维数组 之前一直有筒子问如何设置Installshield中 feature的选中状态,因为在Install Design里是没有这个选项的.今天打开Help搜索了一下,函数如下:FeatureSelectItem ( szFeatureSource, szFeature, bSelect ); szFeatureSource  Specifies the medi

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

[翻译]在 .NET Core 中的并发编程

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点.然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序的性能.在.NET Core中,任务 (tasks) 是并发编程的主要抽象表述,但还有其他支撑类可以使我们的工作更容易. 并发编程 - 异步 v

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

上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队列主要用于实时数据流的处理并简化多线程编程模型.设计该队列时考虑以下几点需求(需求来自公司的一个实际项目): 1. 支持多线程入队出队,尽量简化多线程编程的复杂度. 2. 支持事件触发机制,数据入队时才进行处理而不是使用定时处理机制, 而且内部能阻塞消费者线程. 3. 出队时数据处理的顺序要保证和入队时是一致

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

            本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁,最好的线程之间同步方式就是不加锁,这个地方主要措施就是找出数据之间的哪个地方需要共享数据和不需要共享数据的地方,再设计上避免多线程之间共享数据. 在以前做过的某项目,开始时设计的方案: 开始设计时所有的数据都放入到了公共队列,然后队列通知多个线程去处理数据,队列采用互斥锁保证线程同步,造成的结果就

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

在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于ConcurrentQueue的代码较多所以本文主要分析几个常用操作: 入队(EnQueue) .出队(TryDequeue) .是否为空(IsEmpty).获取队列内元素数量(Count). 一.ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组

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

在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现. 首先解释一下什么这里“无锁”的相关概念. 所谓无锁其实就是在普通栈的实现方式上使用了原子操作,原子操作的原理就是CPU在系统总线上设置一个信号,当其他线程对同一块内存进行访问时CPU监测到该信号存在会,然后当前线程会等待信号释放后才能对内存进行访问.原子操作都是由操作系统API实现底层由硬件支持,常用的操

ActionScript3游戏中的图像编程(连载二十)

1.4.2 灰度的计算方法 回过头来看RGB,站在科学的角度来解释,它们确实也有更明亮的理由,因为下面一排色彩反射出来的色光总量是上一排色的两倍.      为此,作者曾自作聪明地发明了一条“原创”的灰度公式: Gray=(r+g+b)/3 哈哈,用色光总量来表达颜色的灰度想必就比较准确了吧!沾沾自喜一番以后,我还试着用这条自创的定律来转换这张测试图片,上下色块的灰度果然拉开了,可是很不幸地,左右相邻,边界分明的色块依然粘连在一块(图 1.30). 图 1.30 笔者“自创”的灰度转换 显然此法

ActionScript3游戏中的图像编程(连载二十一,第1章完)

1.4.3 用灰度/明度指导色彩搭配 试着只通过调整不等于0的通道,让上一排的色彩在灰度上保持一致,把三个颜色分别代入到心理学公式.得 Gray(red) = r * 0.299      Gray(green) = g * 0.587      Gray(blue) = b * 0.114 让它们灰度相等,则 r * 0.299 = g * 0.587 = b * 0.114 可见,b值一定最大,不妨让b取最大值255,求得r=97, g=50.把这两个值分别应用到红和绿两个色块上. 绿色不再