installshield打包完整示例(4)

2019-01-27 18:48

4. 首先定义所需变量。

在begin前定义6个feature的名字和两个NUMBER类型的变量,即蓝色字串。之前在第一部分我们定义了6个可用的feature,这里就要对这6个feature进行一些判断。 在begin字样后对这6个feature赋值,所赋的值就是我们在第一部分定义的feature的名字(Name, not Display Name)。

//--------------------------------------------------------------------------- function OnFirstUIBefore()

NUMBER nResult, nSetupType, nvSize, nUser;

STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile; STRING szLicenseFile;

LIST list, listStartCopy; BOOL bCustom;

STRING szFeatureName1; STRING szFeatureName2; STRING szFeatureName3; STRING szFeatureName4; STRING szFeatureName5; STRING szFeatureName6; NUMBER bvOpt1,bvOpt2; begin

// TO DO: if you want to enable background, window title, and caption bar title // SetTitle( @PRODUCT_NAME, 24, WHITE );

// SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION ); // Enable( FULLWINDOWMODE ); // Enable( BACKGROUND );

// SetColor(BACKGROUND,RGB (0, 128, 128)); szFeatureName1 =\ szFeatureName2 =\

szFeatureName3 =\ szFeatureName4 =\ szFeatureName5 =\ szFeatureName6 =\

5. 在Dlg_SdStartCopy的listStartCopy = ListCreate( STRINGLIST ); 和

ListDestroy(listStartCopy);之间的nResult = SdStartCopy( szTitle, szMsg, listStartCopy );之前加入如下代码。

ListAddString(listStartCopy,\ ListAddString(listStartCopy,\

ListAddString(listStartCopy,\

ListAddString(listStartCopy,\ switch (nSetupType)

case TYPICAL : ListAddString(listStartCopy,\ case COMPACT: ListAddString(listStartCopy,\ case CUSTOM: ListAddString(listStartCopy,\

endswitch;

ListAddString(listStartCopy,\

ListAddString(listStartCopy,\ if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then ListAddString(listStartCopy,\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then ListAddString(listStartCopy,\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName3)=1) then ListAddString(listStartCopy,\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName4)=1) then ListAddString(listStartCopy,\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName5)=1) then ListAddString(listStartCopy,\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName6)=1) then ListAddString(listStartCopy,\ endif;

6. 代码解释

************************************************************* ListAddString(listStartCopy,\

把要显示的信息添加到list里去,这个list的内容稍后会添加到界面上进行显示。

Help里对这个函数是这样描述的:ListAddString ( listID, szString, nPlacementFlag ); 参数一:listID,需要用户事先创建一个list,这里我们看到listStartCopy = ListCreate( STRINGLIST );这句话,即创建了一个叫listStartCopy的list 参数二:szString,要添加的字符串

参数三:nPlacementFlag,如果设置为AFTER,则顺序添加;如果为BEFORE,则逆序添加,即新添加的内容会放在前面显示。

************************************************************* switch (nSetupType)

case TYPICAL : ListAddString(listStartCopy,\ case COMPACT: ListAddString(listStartCopy,\

case CUSTOM: ListAddString(listStartCopy,\ endswitch;

这是根据用户选择的安装类型来显示安装类型信息。安装类型分三种:TYPICAL,COMPACT和CUSTOM。

*************************************************************

if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then ListAddString(listStartCopy,\ endif;

这里的FeatureIsItemSelected(MEDIA, szFeatureName1)=1是一个很重要的函数,将会在本安装程序内反复出现多次。这个函数用于判断用户是否选择了某feature。Help里对这个函数是这样描述的:FeatureIsItemSelected ( szFeatureSource, szFeature );

参数一:szFeatureSource,大意好像是feature的来源,具体不是很明白到底指什么,反正help自带的例子里写的MEDIA照抄没有错。

参数二:szFeatureName1,就是 feature的名字了

如果用户选择了这个feature,返回值就为1,往list里添加一个关于该feature的相关信息即可。

如此反复,判断所有的feature是否被选择,如被选择则添加一个相关信息即可。

这个就是显示了用户信息,安装路径和安装组件的信息。如果没有添加上述代码,这个界面默认是显示的,但是信息栏里是空白的。

顺便说一句,以前在制作这个安装程序的时候,因为这块显示是空白的,那时候对编程也是一窍不通的,情急之下,笔者把这个显示设置的框框设置了不可见。设置方法如下: 找到User Interface | Dialogs

在中间的导航树上找到SdStartCopy这个选项

这里我们使用的是英文界面,因此点击选中English选项

选中这个界面上的将会显示用户信息的框,把右边的Visible选项设置为False即可

小结:在Dlg_SdStartCopy界面里,用户还可以设置左上角显示的标题和消息,szTitle = \这两行代码如果赋值为空,则显示如图所示的默认信息,用户可以赋值成自己想要显示的信息。

4. 根据用户选择的组件,从外部文件夹拷贝相应的文件到安装目标路径的文件夹中

这个用途常见于配置文件和授权文件的应用,同一程序,授权给不同的用户,只需要不同的配置和授权文件。如果将配置和授权文件每次都打包在安装程序里,那么变更一个用户就需要重新打包一次,这是一个浪费时间和精力的行为。如果将授权和配置文件(当然内容是加密过的)放在外部文件夹中,每次安装的时候从这个文件夹中读取拷贝,那么会是一个比较通用型的安装程序。 另外,本程序的好几个feature用到了相同的库,如果直接在feature下加库文件也可以,但是每一个feature都加一次这个库文件夹,整个安装程序就会变得很庞大,因此比较理想的情况是选到了这个feature的时候从外部拷贝这些库文件。

这里我们先不包括文档这个feature的说明,文档feature另有详细说明。

1. 这个功能需要在OnFirstUIAfter()函数体中实现,选择After Move Data | OnFirstUIAfter选项,即在选择了移动哪些数据后这个操作生效。

2. 之前我们已经接触过了如何判断是否选择了某个Feature,这里也需要判断是否选择了某个Feature,并且根据这个Feature来拷贝对应的外部文件

首先定义一些需要的变量并且进行赋值,蓝色字体即为所定义变量和赋值语句 function OnFirstUIAfter() //feature name

STRING szFeatureName1; STRING szFeatureName2; STRING szFeatureName3; STRING szFeatureName4; STRING szFeatureName5; STRING szSrcFile1; STRING szSrcFile2; STRING szTarFolder1; STRING szTarFolder2; NUMBER nResult;

STRING szTitle, szMsg1, szMsg2, szOption1, szOption2; NUMBER bOpt1, bOpt2; begin

//feature 定义

szFeatureName1 =\ szFeatureName2 =\

szFeatureName3 =\ szFeatureName4 =\ szFeatureName5 =\ //需要拷贝的源文件

szSrcFile1 = \

szSrcFile2 = \ //拷贝的目的地,目标文件夹 szTarFolder1 = \

szTarFolder2 = \

3. 对每一个feature进行判断,进行相应的文件拷贝

在OnFirstUIAfter()的begin和end之间添加如下代码:

//copy the lib to the target ,copy the necessary file to the target if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then

CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\ CopyFile(SRCDISK^\background.gif\

CopyFile(SRCDISK^\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName2)=1) then CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\ CopyFile(SRCDISK^\ endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName3)=1) then CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\ CopyFile(SRCDISK^\

endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName4)=1) then CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1); endif;

if (FeatureIsItemSelected(MEDIA, szFeatureName5)=1) then CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1); endif;

4. 代码解释

if (FeatureIsItemSelected(MEDIA, szFeatureName1)=1) then CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1);

CopyFile(SRCDISK^\ CopyFile(SRCDISK^\background.gif\

CopyFile(SRCDISK^\ endif;

**************************************************************************************

FeatureIsItemSelected(MEDIA, szFeatureName1) 这个函数用于判断用户是否选择了某feature。Help里对这个函数是这样描述的:FeatureIsItemSelected ( szFeatureSource, szFeature ); 参数一:szFeatureSource,大意好像是feature的来源,具体不是很明白到底指什么,反正help自带的例子里写的MEDIA照抄没有错。

参数二:szFeatureName1,就是 feature的名字了 如果返回值为1,则说明用户选择了这个feature

************************************************************************************** CopyFile(SRCDISK^szSrcFile1, TARGETDIR^szTarFolder1);

拷贝文件的函数。Help里是这样描述的:CopyFile ( szSrcFile, szTargetFile );

参数一:szSrcFile,源文件,可带路径,要带有扩展名的文件名。当这个文件带路径时,则从这个指定路径下拷贝指定的文件;如果是不带路径的,则直接从安装文件所在盘的盘符下寻找指定的文件来进行拷贝。如果要拷贝某个文件夹下的一系列文件,可以使用通配符。

参数二:目标文件,可带路径,要带有扩展名的文件名。当这个文件带路径时,则将文件拷贝到这个指定路径下;如果是不带路径的,则将文件拷贝到安装路径下。支持通配符。

小结:上面这段代码的意思是:如果用户选择了某个feature,则从安装程序所在的盘下面的一些文件夹下拷贝文件到目标路径下的一些对应文件夹下。这里记住拷贝文件一定要带上文件的全名,包括扩展名。

5. 如果用户选择了文档feature,则把文档文件夹拷贝进来,并且对该文件夹进行遍历,为每一个文档创建一个在开始菜单下的快捷方式

1. 这个功能仍然在After Move Data | OnFirstUIAfter()的函数里实现 先定义一些变量并赋值,蓝色字体 function OnFirstUIAfter() //feature name

STRING szFeatureName6;//feature名 STRING szSrcFile3; //需要拷贝的源文件

STRING szTarFolder3; //拷贝的目的地,带文件名

STRING szTarFolder4; //拷贝的目标文件夹,后面有一个函数要用到不带文件名的目标路径 STRING szDocFile, szDocFileName;// szDocFile,查找函数返回的查询得到文件名;szDocFileName,要查找的文件名

NUMBER nResult; //数字型变量,存放函数的返回结果 begin

//feature 定义

szFeatureName6 =\ //需要拷贝的源文件


installshield打包完整示例(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:建筑工程预结算常见问题与改进措施的分析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: