初次使用InstallShield笔记
公司的产品需要打包发布,以前一直没打包,打包方法的学习交给了我
下面的内容是我研究过后的,通过回忆写的笔记。由于不熟悉,可能会有错误或者是笨办法,希望高手指正,感激不尽。
有些东西是什么,以及是什么意思我也不太清楚,反正我照这么做是满足了我的需求。
需求如下
项目包含主程序和数据库文件两个部分,可以选择这两个部分安装在不同的地方
当文件都复制完之后将数据库文件的安装路径写进程序安装目录下的一个ini文件当中
工具选择
1. VS05自带的打包工具
一开始选择的这个工具,不过我太菜我确实不知道怎么让这个来满足我们的需求
2. InstallShield 2009 pro
随后想到了专业打包工具IS,下载了较新的版本试用。不过网上教程较少,软件功能强大,因此在慢慢摸索中。
步骤
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;
|
初次使用InstallShield笔记的更多相关文章
- 初次接触Service笔记
Service是后台的运行的小程序,分两种一种是StarService()另外一种是bindService(),这种可调用Service中的方法和返回结果等操作而StarService不能 他的生命周 ...
- 【Spark】【RDD】初次学习RDD 笔记 汇总
RDD Author:萌狼蓝天 [哔哩哔哩]萌狼蓝天 [博客]https://mllt.cc [博客园]萌狼蓝天 - 博客园 [微信公众号]mllt9920 [学习交流QQ群]238948804 目录 ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- 【译】SQ3R学习法则
SQ3R 观察-提问-阅读-复述-回顾 背景 SQ3R是一种理解策略,可帮助学生在阅读时思考他们正在阅读的文章. SQ3R通常被归类为学习策略,通过教导学生在初次阅读一篇文章时如何阅读和像高效读者一样 ...
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- Spring Cloud学习笔记--Spring Boot初次搭建
1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...
- InstallShield 脚本语言学习笔记
InstallShield脚本语言是类似C语言,利用InstallShield的向导或模板都可以生成基本的脚本程序框架,可以在此基础上按自己的意愿进行修改和添加. 一.基本语法规则 ...
- Django笔记-MySQL初次使用设置
以下为个人学习时的笔记,正在完善中........... [1]启动服务 [root@bogon /]# service mysqld start正在启动 mysqld: [确定] [root@bog ...
- 初次使用Docker的体验笔记
一.前言 Docker容器已经发布许久,但作为一名程序员如今才开始接触,实在是罪过-- 在此之前,我还没有对Docker进行过深入的了解,对它的认识仍停留在:这是一种新型的虚拟机.这样的 ...
随机推荐
- RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考
RDIFramework.NET 框架兼容各种数据库类型事务使用范例参考 RDIFramwork.NET框架对数据库的事务做了很好的控制,对多表或多条语句需要在同一事务执行提供了很好的支持,同时支持任 ...
- 起因:dell超级密码算号器 1F66
班里有几个比较调皮的同学~(显然不包括我[开玩笑的]) 当初班长设置了密码,结果那几个玩拳皇的想玩,就找我删除了密码~ 最后有个大神就过来设置了BIOS.有种终于出动了的样子.有种我看你怎么办的样子. ...
- Datatable的查找和排序(Datatable.Select)
Datatable 是一种常用的数据结构.数据类型有点类似于数据库中的表结构.在没有使用优秀的orm框架前,大部分的数据库的数据都是先变为Datatable 然后再通过代码转换变成 object. ...
- String.format中大括号的加入方法
因为相对于string Builder 自己更喜欢 string.format 的形式拼接字符串。 今天在写代码的时候怎么都报错,弄的我很奇怪 最后发现问题出在字符串中出现大括号“{”的问题,我想这 ...
- c#与.net的简介
c语言诞生于上世纪60年代,后来诞生了面向对象的c++,后来出现看更为精简的java,微软之后又出了c#语言.早期的c#语言和java语言类似.经过长足的发展,c#变得越来越完美. 面向对象 简单,安 ...
- Java连接Redis (key-value存储系统)
Redis简介: redis是一个性能非常优秀的内存数据库,通过key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表). ...
- jenkins解决jenkins内存溢出问题
在jenkins master-slave配置中,总是出现内存溢出问题,更换了机器设备仍然跑不起来: 问题如下: Status Code: 500 Exception: org.apache.comm ...
- 企业信息系统——SCM
供应链是供应商.制造商.仓库.配送中心和渠道商等构成的物流网络.同一个企业可能构成这个网络的不同组成节点,但更多的情况下是由不同的企业构成这个网络中的不同节点.例如,在某条供应链中,某个企业可能即在制 ...
- 微信、qq信息汇总、回复(一)
想法: 有的人喜欢用qq,有的人喜欢用微信,总而言之,是一个通信工具. qq上有很多群,微信上有很多群,每个群挨个浏览一遍.回复,还容易回复错误,前言不接后语. ...
- UICollectionViewDelegateFlowLayout 使用
import UIKit //UICollectionViewLayout //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell的尺寸,可以使用下面方法: // - (C ...