我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开。原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dll文件和exe文件放在同一个目录下,才能正常打开。这也没什么,后来发现还不行?跳出来一个提示框,大意是在某个路径下没有找到需要的文件(这个程序基于其他软件的开发包,所以就会在没有安装该软件的电脑上出现这样的提示)。。。那怎么解决呢?难道移植到其他电脑的时候,还要手动复制文件到指定的目录。。。

更便捷的办法,就是把这些文件打包成一个安装文件。这样,在安装过程中,就可以把文件复制到指定的目录,而且不需要的时候还可以把这个程序完整地卸载掉。

选择安装包制作软件的时候,由于VS2013没有自带的安装包软件,第三方的Install Sheild又是个收费的软件,申请试用版也比较繁琐,我最终选了Inno Install这个小巧的免费程序,简单易用,功能对 我来说也已足够。这里是Inno Setup官方下载地址:http://www.jrsoftware.org/isdl.php。注意,这个是英文版的,想要中文版的可以到网上找找。

Inno Setup的具体使用,可以参考这篇文章“快速打包你的应用程序——Inno Setup

通过以上,基本就可以使用啦。

有一个小小的不足,就是安装程序之后,生成的卸载文件的名字是unins000.exe等等。而且Inno Setup制作的安装包,可以允许同一个程序在同一个目录下安装多次。要修正这点不足,可以在通过向导自动生成.iss文件后,在文件中添加一些代码。

1、首先预定义卸载文件的文件名,在文件开头的#define部分添加

#define MyAppUninstallExeName "Uninstall.exe"

2、创建卸载图标,在[Icons]部分添加(如果已经在制作向导时勾选创建卸载图标,那么这一句应该会自动生成,不必手动添加了)

Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{app}\{#MyAppUninstallExeName}"

3、执行代码,改变卸载文件的文件名。在[Run]部分的前面添加

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
uninspath,uninsname,NewUninsName,MyAppName:string;
begin
if CurStep=ssDone then
begin
NewUninsName := 'Uninstall';
MyAppName:= 'Measurement'; uninspath:=ExtractFilePath(ExpandConstant('{uninstallexe}'));
uninsname:=Copy(ExtractFileName(ExpandConstant('{uninstallexe}')),,);
RenameFile(uninspath+uninsname+'.exe',uninspath+NewUninsName+'.exe');
RenameFile(uninspath+uninsname+'.dat',uninspath+NewUninsName+'.dat'); if RegKeyExists(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+MyAppName+'\_is1') then
begin
RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'+MyAppName+'_is1','UninstallString','"'+uninspath+NewUninsName+'.exe"');
RegWriteStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'+MyAppName+'_is1','QuietUninstallString','"'+uninspath+NewUninsName+'.exe"/SILENT');
end ;
end ;
end ;

这里我的App名字是Measurement,根据自己的情况可以给它赋成自己的AppName。

4、使用Inno Setup打包安装程序还有一些问题,比如重复安装检测和.net框架安装检测等等。这些问题都可以到网上找到解决方案。

以上两个问题可以参考这篇文章来解决,使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)

Inno Setup制作应用程序安装包的更多相关文章

  1. 用Inno Setup制作WEB程序安装包

    原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本 [Setup] AppCopyright=tes ...

  2. [Azure DevOps] 使用 Inno Setup 制作桌面软件安装包

    1. 桌面应用程序的 CI/CD 桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的"部署"只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以 ...

  3. 用inno Setup做应用程序安装包的示例脚本(.iss文件)(

    用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...

  4. 用inno Setup制作web项目安装包

    http://www.cnblogs.com/xionghui/archive/2012/03/22/2411207.html 用inno Setup制作安装包 新建一个文件夹exambody,放ap ...

  5. setup factory 9制作VB程序安装包

    setup factory 使用起来很简单你可以如下:1.你把你刚编译出来的exe和相关的资源文件复制到某一空目录下.把exe文件添加到setup factory里之后,在列表里右键,属性里面可以设置 ...

  6. rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例

    下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...

  7. INNO setup 制作安装包

    1.获取SQLserver安装路径vardbpath:string;rtn:boolean;rtn := RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWA ...

  8. 20 Inno Setup制作安装包的几个问题

    系统开发好之后,通常需要制作成安装包,才能卖给用户.利用Inno Setup的向导可以制作简单的安装包,但是如果要做个好的安装包的话可能会遇到一些麻烦,今日终于抽空解决了,Inno Setup打包的一 ...

  9. 用Inno setup制作以管理员权限启动的安装包

    inno setup制作的安装包,默认是不需要管理员权限启动的.我们制作安装包,往往需要做一些设置工作,这些设置工作可能用到管理员权限.使用Resource Hacker修改inno setup资源, ...

随机推荐

  1. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

  2. Android shell 下 busybox,clear,tcpdump、、众多命令的移植

    http://my.oschina.net/mopidick/blog/167372 作为一名Android开发者,经常需要进入Android 的shell终端运行一些命令.但是我们发现Android ...

  3. BZOJ1180: [CROATIAN2009]OTOCI

    传送门 一遍AC,开心! $Link-Cut-Tree$最后一题 //BZOJ 1180 //by Cydiater //2016.9.18 #include <iostream> #in ...

  4. Nginx系列2之Nginx+php

    preface 公司所有的大多数业务都泡在LNMP平台上,所以对PHP+Nginx有点了解,那么就做个小小的总结吧. what's FastCGi FastCGI是一个可伸缩,高速的在HTTP ser ...

  5. 日期String相互转换

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date endate = sdf.parse(endDate) ...

  6. JDBC编程的方式

    JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...

  7. C#中int,string,char[],char的转换(待续)

    //char[]转string string mm = "woshicainiao"; char[] ss = mm.ToCharArray(); string AA = new ...

  8. jsp action中附件下载的写法

    //一些主要的包和类 import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java ...

  9. codeforces 697B Barnicle

    题目链接:http://codeforces.com/problemset/problem/697/B 题目大意: 将科学计数法用十进制表示.[如果类似于7.0应输出7] 解题思路: Java 中 B ...

  10. super的作用(转自百度)

    super出现在继承了父类的子类中.有三种存在方式:第一种super.xxx;(xxx为变量名或对象名)这种方法意义为,获取父类中的名字为xxx的变量或方法引用.使用这种方法可以直接访问父类中的变量或 ...