步骤
1. 开始
网上说一般的打包工程选择Basic MSI Project,如果需要对界面需要进行很高的定制就需要选择InstallScript MSI Project。

由于我只需要打包,已经执行部分脚本因此我选择了Basic MSI Project。输入Project Name,选择Location后点击OK,新建工程。
进入到下图界面,此时我们可以选择两种打包方式(红框处选择)
1.Project Assistant 可以进行简单的类似向导类的配置即可进行打包工作,如果选择这种方式,Visual Studio自带的工具也能轻松实现
2.Installation Designer 完全自由化的配置,自我定制程度最高。
根据需求情况,我自然选择第二种方式

2.配置
点选Installation Designer,进入如下界面

红框处就是需要选择配置的区域了。
2.1 General Information
在Installation Information中选择General Information,在这里配置软件的基本信息

红线处你可以写上你的大名,你是这个Project的作者
下面的Setup Langueages可以选择安装语言,我这里只考虑了简体中文,故未更改设置。

红框里填写上你公司的名字和网址,我举个例子才写的这两个

在Product Properties中填入软件的信息,软件的名字、版本什么的。
INSTALLDIR是指安装目录,图中的配置方法默认是指这个路径: C:/Program Files/Transformers/Demo
2.2 Files

右边的区域被分成了四块,上面两块是本地计算机,下面两块是目标计算机
总的思路跟资源管理一样,这里你就可以按照你自己的思路来定制了
举个列子,我随便找点东西打包
在Destination computer’s folders中把树展开,选中Demo[INSTALLDIR],这是什么东西相信看看就明白了,如果不明白的话那就需要再学习下基础知识了。
从Source computer‘s files(本地计算机)中拖动一些文件到Destination computer’s files中,就会弹出如下提示

你需要创建一个Feature,什么是Feature我不太清楚,我把它理解成一个文件的集合。输入名字,我输入的是Main,点击OK

(如果你看不到上图中左边红框内的东西,就在那里的树状结构任意节点点击右键,勾选Show Components就能看到了)
当你把你想打包的东西添加进入过后,一个最基本的包就打好了,已经可以编译执行尝试安装了。

工具栏上的图标编译跟执行跟VC++6.0的图标是一样的吧,第三个红圈就是卸载
当然只做到这一步是不能满足我的需求的,我还需要添加一个数据库文件夹,在Demo[INSTALLDIR]上点击右键——选择New Folder——命名为Database
进行图中操作

直接点击下一步,到第二步,按图中操作

再下一步,将数据库相关文件都添加进去,当然你可以先添加一个文件(夹)进去,其余的在“Files and Folders”中继续添加。
至此,数据库文件也添加到了安装包内,不过默认的安装流程中只有选择主程序的安装路径没有选择数据库的路径,因此需要手动添加。
方法见2.3
2.3 Sequences
大家应该都安装过软件,最菜的人也知道一路点击“下一步”来安装程序。这部分就讲一下如何定制安装的顺序,就是“上一步”与“下一步”的跳转。

最左边选择Custom Actions and Sequences后,在中间的树中如图操作,User Interface上点击右键——Insert…

点击OK后Sequences树中多了个DatabaseFolder,可以拖动他到想要的位置。
当然Sequences的编辑还没那么简单,貌似通过拖动无法实现,需要对每个窗体进行编辑。

如图所示,图中的意思就是在选择DatabaseFolder的路径的对话框中,点击“上一步”按钮会跳转到CustomerInformation这个对话框中
就是这样编辑,工作量也不小,或者是有其他什么简便方法,可是我不知道
2.4 动态修改XML或者INI文件
在这个项目中,我需要将项目的安装路径写在安装目录下的一个ini文件中,这个ini文件是需要打包在项目中的。

首先确保ini文件已经添加进入打包工程。

在INI File Changes中新建一个与欲改写的ini文件同名的ini文件——my.ini
在my.ini文件下建立欲改写的section(我的例子是installdir)以及keyword(例子中是dir),编辑keword
在Data Value中写入系统变量[INSTALLDIR],这个就表示程序的安装目录。如果要获取数据库的安装目录就可以写入[DATABASEDIR]
XML的修改跟这个类似,相信都可以融会贯通。
在我的实际项目中,遇到个问题。
my.ini是mysql要用到的东西,是放在数据库目录中的,安装上面的方法略加修改就可以实现。
但是mysql需要的路径类似于C:/MyDataBase/MySql/
而通过我上面方法[DATABASEDIR]获得的路径是Windows标准的 C:/MyDataBase/MySql/
因此我必须要把这个斜线给反过来,我不知道怎么反。只知道可能通过脚本来修改(如果有高人知道简便方法,请指点)
脚本见2.5
2.5 InstallScript
刚刚接触,我连在哪里写脚本都不知道,跟别说如何写脚本了,虽然我现在也不会写脚本~~(求教啊)
虽然还不会写脚本,还是先把在哪里写以及如何运行脚本写出来,希望有跟我有同样问题的朋友看到。

然后出现下图

右边是编辑区,用于写脚本。有编程经验的话这个不难理解
脚本的执行回到Custom Actions and Sequences,在中间的列表中的Custom Actions上点击右键,选择Custom Actions Wizard
在Action Type中选择Run InstallScript code,在Insert into Sequence中的Install Execute Sequence处选择何时执行,其余按向导提示操作。
#include "ifx.h" export prototype ProcessAfterDataMove(HWND); export prototype STRING ReplaceStr(STRING); export prototype RunBat(STRING);
function ProcessAfterDataMove(hMSI) STRING P_Dir,DB_Dir; // P_Dir是主程序目录下ini文件的路径,DB_Dir是数据库的路径 begin P_Dir = TARGETDIR + "temp.ini"; //TARGETDIR是系统变量,存放安装路径 //GetProfString()函数是系统函数,用于读取ini文件中的信息 //第一个参数指定文件所在路径 //第二个参数指定section名 //第三个参数指定keyword名 //最后一个参数用于 返回 前面指定的keyword的值。注意:是返回! GetProfString (P_Dir, "temp", "dir", DB_Dir); //ReplaceProfString()函数是系统函数,用于修改ini文件中keyword的值 //第一个参数指定文件所在路径 //第二个参数指定section名 //第三个参数指定keyword名 //第四个参数指定keyword原值 //第五个参数指定keyword的新值 //只有前面4个条件完全匹配时,原值才会被第五个参数中的新值替换 ReplaceProfString (DB_Dir + "my.ini", "mysqld", "basedir", "/"" + DB_Dir + "/"", "/"" + ReplaceStr(DB_Dir) + "/""); ReplaceProfString (DB_Dir + "my.ini", "mysqld", "datadir", "/"" + DB_Dir + "Data/"", "/"" + ReplaceStr(DB_Dir + "Data") + "/""); //执行批处理 RunBat(DB_Dir); end; function STRING ReplaceStr(Str) LIST StrList; STRING temp,path; begin //创建List存放Tokens StrList = ListCreate(STRINGLIST); //分解出Token存入List StrGetTokens( StrList, Str, "//"); //取出TokenList的头节点 ListGetFirstString(StrList, temp); //头节点后加入 “/” path = temp + "/"; //循环 取出所有的节点 后面加入“/” while(ListGetNextString(StrList, temp) = 0) path = path + temp + "/"; endwhile; return path; end; function RunBat(DB_Dir) //执行批处理 STRING dir; begin dir = DB_Dir + "bin//exec.bat" ; //调用其他程序 //第一个参数是调用程序的位置 //第二个参数是调用程序运行所需参数 //WAIT表示等到执行完毕这个程序,安装再继续进行 LaunchAppAndWait(dir, "",WAIT); end; |