使用InstallShield2009的笔记 2009-12-3009:16 公司的产品需要打包发布,以前一直没打包,打包方法的学习交给了我 下面的内容是我研究过后的,通过回忆写的笔记。由于不熟悉,可能会有错误或者是笨办法,希望高手指正,感激不尽。 有些东西是什么,以及是什么意思我也不太清楚,反正我照这么做是满足了我的需求。 需求如下 项目包含主程序和数据库文件两个部分,可以选择这两个部分安装在不同的地方 当文件都复制完之后将数据库文件的安装路径写进程序安装目录下的一个ini文件当中 工具选择 1.VS05自带的打包工具 ????一开始选择的这个工具,不过我太菜我确实不知道怎么让这个来满足我们的需求 2.InstallShield2009pro ????随后想到了专业打包工具IS,下载了较新的版本试用。不过网上教程较少,软件功能强大,因此在慢慢摸索中。 步骤 1.开始 ??网上说一般的打包工程选择BasicMSIProject,如果需要对界面需要进行很高的定制就需要选择InstallScriptMSIProject。
由于我只需要打包,已经执行部分脚本因此我选择了BasicMSIProject。输入ProjectName,选择Location后点击OK,新建工程。 进入到下图界面,此时我们可以选择两种打包方式(红框处选择) 1.ProjectAssistant??可以进行简单的类似向导类的配置即可进行打包工作,如果选择这种方式,VisualStudio自带的工具也能轻松实现 2.InstallationDesigner完全自由化的配置,自我定制程度最高。 根据需求情况,我自然选择第二种方式
2.配置 点选InstallationDesigner,进入如下界面
红框处就是需要选择配置的区域了。 2.1GeneralInformation 在InstallationInformation中选择GeneralInformation,在这里配置软件的基本信息
红线处你可以写上你的大名,你是这个Project的作者 下面的SetupLangueages可以选择安装语言,我这里只考虑了简体中文,故未更改设置。
红框里填写上你公司的名字和网址,我举个例子才写的这两个
在ProductProperties中填入软件的信息,软件的名字、版本什么的。 INSTALLDIR是指安装目录,图中的配置方法默认是指这个路径:C:\ProgramFiles\Transformers\Demo 2.2Files
右边的区域被分成了四块,上面两块是本地计算机,下面两块是目标计算机 总的思路跟资源管理一样,这里你就可以按照你自己的思路来定制了 举个列子,我随便找点东西打包 在Destinationcomputer’sfolders中把树展开,选中Demo[INSTALLDIR],这是什么东西相信看看就明白了,如果不明白的话那就需要再学习下基础知识了。 从Sourcecomputer‘sfiles(本地计算机)中拖动一些文件到Destinationcomputer’sfiles中,就会弹出如下提示
你需要创建一个Feature,什么是Feature我不太清楚,我把它理解成一个文件的集合。输入名字,我输入的是Main,点击OK
(如果你看不到上图中左边红框内的东西,就在那里的树状结构任意节点点击右键,勾选ShowComponents就能看到了) 当你把你想打包的东西添加进入过后,一个最基本的包就打好了,已经可以编译执行尝试安装了。
工具栏上的图标编译跟执行跟VC++6.0的图标是一样的吧,第三个红圈就是卸载 当然只做到这一步是不能满足我的需求的,我还需要添加一个数据库文件夹,在Demo[INSTALLDIR]上点击右键——选择NewFolder——命名为Database 进行图中操作
直接点击下一步,到第二步,按图中操作
再下一步,将数据库相关文件都添加进去,当然你可以先添加一个文件(夹)进去,其余的在“FilesandFolders”中继续添加。 至此,数据库文件也添加到了安装包内,不过默认的安装流程中只有选择主程序的安装路径没有选择数据库的路径,因此需要手动添加。 方法见2.3 2.3Sequences 大家应该都安装过软件,最菜的人也知道一路点击“下一步”来安装程序。这部分就讲一下如何定制安装的顺序,就是“上一步”与“下一步”的跳转。
最左边选择CustomActionsandSequences后,在中间的树中如图操作,UserInterface上点击右键——Insert…
点击OK后Sequences树中多了个DatabaseFolder,可以拖动他到想要的位置。 当然Sequences的编辑还没那么简单,貌似通过拖动无法实现,需要对每个窗体进行编辑。
如图所示,图中的意思就是在选择DatabaseFolder的路径的对话框中,点击“上一步”按钮会跳转到CustomerInformation这个对话框中 就是这样编辑,工作量也不小,或者是有其他什么简便方法,可是我不知道 2.4动态修改XML或者INI文件 在这个项目中,我需要将项目的安装路径写在安装目录下的一个ini文件中,这个ini文件是需要打包在项目中的。
首先确保ini文件已经添加进入打包工程。
在INIFileChanges中新建一个与欲改写的ini文件同名的ini文件——my.ini 在my.ini文件下建立欲改写的section(我的例子是installdir)以及keyword(例子中是dir),编辑keword 在DataValue中写入系统变量[INSTALLDIR],这个就表示程序的安装目录。如果要获取数据库的安装目录就可以写入[DATABASEDIR] XML的修改跟这个类似,相信都可以融会贯通。 在我的实际项目中,遇到个问题。 my.ini是mysql要用到的东西,是放在数据库目录中的,安装上面的方法略加修改就可以实现。 但是mysql需要的路径类似于C:/MyDataBase/MySql/ 而通过我上面方法[DATABASEDIR]获得的路径是Windows标准的C:\MyDataBase\MySql\ 因此我必须要把这个斜线给反过来,我不知道怎么反。只知道可能通过脚本来修改(如果有高人知道简便方法,请指点) 脚本见2.5 2.5InstallScript 刚刚接触,我连在哪里写脚本都不知道,跟别说如何写脚本了,虽然我现在也不会写脚本~~(求教啊) 虽然还不会写脚本,还是先把在哪里写以及如何运行脚本写出来,希望有跟我有同样问题的朋友看到。
然后出现下图
右边是编辑区,用于写脚本。有编程经验的话这个不难理解 脚本的执行回到CustomActionsandSequences,在中间的列表中的CustomActions上点击右键,选择CustomActionsWizard 在ActionType中选择RunInstallScriptcode,在InsertintoSequence中的InstallExecuteSequence处选择何时执行,其余按向导提示操作。
#include"ifx.h" ?? ???exportprototypeProcessAfterDataMove(HWND);?? ???exportprototypeSTRINGReplaceStr(STRING);???? ???exportprototypeRunBat(STRING);
functionProcessAfterDataMove(hMSI)?? ??STRINGP_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;?? ??????? functionSTRINGReplaceStr(Str) LISTStrList; STRINGtemp,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; returnpath;??? end;??????? ??????? ??????? functionRunBat(DB_Dir)????//执行批处理???? STRINGdir;?????????????? begin dir=DB_Dir+"bin\\exec.bat"; //调用其他程序 //第一个参数是调用程序的位置 //第二个参数是调用程序运行所需参数 //WAIT表示等到执行完毕这个程序,安装再继续进行 LaunchAppAndWait(dir,"",WAIT); end; |
|