我最近写了一个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. AngularJs ngHref、ngSrc、ngCopy/ngCut/ngPaste

    ngHref 在Angular程序没完成改变链接上用{{hash}}方式绑定的href值的时候,当用户点击该链接会跳到一个错误的页面. 格式:ng-href=”value” value:表达式. 使用 ...

  2. POJ 2823 Sliding Window + 单调队列

    一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1)   从队首删除 (2)   从队尾删除 (3)   从队尾插入 (4)   ...

  3. wildfly jboss deploy 报 拒绝访问

    用maven clean package wildfly:deploy 部署war,不时报拒绝访问.有时重启wildfly即可.有时需要在standalone.xml中删除war部署: <dep ...

  4. Android onLowMemory()和onTrimMemory()

    1. OnLowMemory OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLo ...

  5. DRY原则

    DRY--Don't Repeat Yourself Principle,直译为"不要重复自己"原则 DRY简而言之,就是不要写重复的代码.原则本身很简单,但是,对于OOAD(面向 ...

  6. curl方式创建elasticsearch的mapping

    curl方式创建elasticsearch的mapping curl -XPUT 'http://192.168.1.105:9200/bank/item2/_mapping' -d '{ " ...

  7. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

  8. codeforces 724B Batch Sort(暴力-列交换一次每行交换一次)

    题目链接:http://codeforces.com/problemset/problem/724/B 题目大意: 给出N*M矩阵,对于该矩阵有两种操作: (保证,每行输入的数是 1-m 之间的数且不 ...

  9. group

    学习Linq时,经常会遇到Linq使用Group By问题,这里将介绍Linq使用Group By问题的解决方法. 1.计数 var q = from p in db.Products group p ...

  10. mssql注入

    <%@ Page Language="C#" AutoEventWireup="true" %> <%@ Import Namespace=& ...