Qt软件打包技术--基于实际项目开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39568531/article/details/84642971

最近一直忙于独立的项目开发,有段时间没有上csdn了。昨天看到有朋友留言关于软件打包的问题。现在给大家分享一个我总结的软件打包技术文章。水平不高,存在错误之处请不吝指正。不过可以保证的是,文中所有,皆是实际项目总结,拿过去稍微修改下大家就可以用的了。

   首先,我们从大家最感兴趣的打包发布来介绍起。毕竟,制作一个可以安装的程序还是挺令人感到兴奋的一件事情。

这里软件的打包我着重向大家介绍两个打包软件:NisEdit(2.2.3)和Inno Setup Complier(5.5.9),pc端的桌面应用软件基本上都可以使用这两个软件来打包。
在这里插入图片描述

一、NisEdit软件打包工具

1、软件打包流程:基于向导功能
在这里插入图片描述
从上图可以看到NisEdit的界面非常简单,功能不是很多,但是对于我们进行软件打包已经绰绰有余。
这里只着重给大家介绍一下几个我们打包必须要用到的功能键。
在这里插入图片描述
1、向导功能:文件–》新建脚本向导
这个功能的好处在于,即便你不会使用NisEdit编写软件打包脚本文件,通过图形化的向导界面也可以在轻而易举的打包一个软件安装程序出来。
下面,我们以AnyAccess软件的为例,使用NisEdit对软件进行打包。当然,在打包之前我们必须做好必要的准备工作,也就是发布版本的AnyAccess.exe程序,程序所依赖的库文件和配置文件。(这个步骤可以依赖某些辅助打包软件进行,具体不介绍。有兴趣的,请大家自己百度下。)
在这里插入图片描述
上图已经包含了我们软件打包所需要的所有文件。需要注意的是文件的位置。在Qt编程中,我们常常习惯使用生成的可执行程序作为相对的路径来设置其他相关联文件的路径,同样在打包文件中也要保证文件相对路径的正确。
文件准备好了,那么我们开始使用NisEdit的向导来打包程序啦。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
这里是一个比较重要的位置,首先,在向导程序默认的文件目录中会出现图中所显示的两条目录
,我们要做的第一件事情,就是删除这两个目录。
在这里插入图片描述
下面,就是最重要的部分了。点击文件tree的按钮,添加整个打包文件的dir。
这时候,所有需要打包的文件都被加载到文件列表中。继续点击下一步。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

点击完成后,选择保存脚本到anyaccess.nsi文件中.脚本自动编译,软件开始打包。
在这里插入图片描述
在这里插入图片描述
上图显示的即为自动生成的Nsi脚本文件。脚本文件的学习介绍,我将放到接下来的内容中。
在这里插入图片描述

可以看到,打包完成,生成了一个名叫Setup.exe的可执行程序。大工告成。是不是感到比较兴奋,迫不及待想安装试一试,看看这个可执行程序是不是如同其他的pc应用一样呢?赶紧动手吧。
在这里插入图片描述

安装之后,我们发现在桌面果然生成了一个AnyAccess的桌面快捷方式图标。点击这个图标,顺利的启动了软件,进入到我们的软件登录界面。那么,你就可以测试一下这个打包发布的软件的具体功能啦。是不是很有成就感!哈!

2、NSI脚本
;在脚本中常用的注释是;
; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME “AnyAccess”
!define PRODUCT_VERSION “1.0”
!define PRODUCT_PUBLISHER “武汉市亿维自动化有限公司”
!define PRODUCT_WEB_SITE “http://www.unimat.com.cn
!define PRODUCT_DIR_REGKEY “Software\Microsoft\Windows\CurrentVersion\App Paths\AnyAccess.exe”
!define PRODUCT_UNINST_KEY “Software\Microsoft\Windows\CurrentVersion\Uninstall${PRODUCT_NAME}”
!define PRODUCT_UNINST_ROOT_KEY “HKLM”

; MUI 1.67 compatible ------
!include “MUI.nsh”

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON “app.ico”
!define MUI_UNICON “${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico”

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT “ P R O D U C T U N I N S T R O O T K E Y " ! d e f i n e M U I L A N G D L L R E G I S T R Y K E Y " {PRODUCT_UNINST_ROOT_KEY}" !define MUI_LANGDLL_REGISTRY_KEY " {PRODUCT_UNINST_KEY}”
!define MUI_LANGDLL_REGISTRY_VALUENAME “NSIS:Language”

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE “licence.txt”
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 8: INSTDIR\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲.exe" !define M…INSTDIR\licence.txt”
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE “English”
!insertmacro MUI_LANGUAGE “SimpChinese”

; MUI end ------

Name “${PRODUCT_NAME} P R O D U C T V E R S I O N " O u t F i l e " S e t u p . e x e " I n s t a l l D i r " {PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir " PROGRAMFILES\AnyAccess”
InstallDirRegKey HKLM “${PRODUCT_DIR_REGKEY}” “”
ShowInstDetails show
ShowUnInstDetails show

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

Section “主程序必选” SEC01
SetOutPath “ I N S T D I R " S e t O v e r w r i t e t r y F i l e " A n y A c c e s s . e x e " C r e a t e D i r e c t o r y " INSTDIR" SetOverwrite try File "AnyAccess.exe" CreateDirectory " SMPROGRAMS\AnyAccess”
CreateShortCut “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 11: SMPROGRAMS\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲\AnyAccess.lnk"…INSTDIR\AnyAccess.exe”
CreateShortCut “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 8: DESKTOP\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲.lnk" "INSTDIR\AnyAccess.exe”
File “AnyAccess.iss”
File “AnyAccess_zh.qm”
File “AnyAccess_zh.ts”
File “app.ico”
File “configure.ini”
File “IEShims.dll”
SetOutPath “KaTeX parse error: Expected 'EOF', got '\json' at position 8: INSTDIR\̲j̲s̲o̲n̲\lib" File "j…INSTDIR\jsoncpplib”
File “jsoncpplib\jsoncpp.lib”
SetOutPath “KaTeX parse error: Double subscript at position 88: … File "libgcc_s_̲dw2-1.dll" Fi…INSTDIR\Map”
File “Map\deviceMap.html”
SetOutPath “ I N S T D I R " F i l e " m i n g w m 10. d l l " F i l e " Q t C o r e 4. d l l " F i l e " Q t C o r e d 4. d l l " F i l e " Q t G u i 4. d l l " F i l e " Q t G u i d 4. d l l " F i l e " Q t N e t w o r k 4. d l l " F i l e " Q t N e t w o r k d 4. d l l " F i l e " Q t S q l d 4. d l l " F i l e " Q t W e b K i t 4. d l l " S e t O u t P a t h " INSTDIR" File "mingwm10.dll" File "QtCore4.dll" File "QtCored4.dll" File "QtGui4.dll" File "QtGuid4.dll" File "QtNetwork4.dll" File "QtNetworkd4.dll" File "QtSqld4.dll" File "QtWebKit4.dll" SetOutPath " INSTDIR\softwares”
File “softwares\libcrypto-1_1.dll”
File “softwares\liblzo2-2.dll”
File “softwares\libpkcs11-helper-1.dll”
File “softwares\libssl-1_1.dll”
File “softwares\openvpn.exe”
File “softwares\startop.vbs”
File “softwares\startvpn.bat”
File “softwares\startvpn.bat.bak”
File “softwares\startvpn.vbs”
File “softwares\stopvpn.bat”
File “softwares\vnc_windows.exe”
File “softwares\yiwei4.ovpn”
SectionEnd

Section -AdditionalIcons
SetOutPath I N S T D I R W r i t e I n i S t r " INSTDIR WriteIniStr " INSTDIR${PRODUCT_NAME}.url" “InternetShortcut” “URL” “ P R O D U C T W E B S I T E " C r e a t e S h o r t C u t " {PRODUCT_WEB_SITE}" CreateShortCut " SMPROGRAMS\AnyAccess\Website.lnk” “$INSTDIR${PRODUCT_NAME}.url”
CreateShortCut “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 11: SMPROGRAMS\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲\Uninstall.lnk"…INSTDIR\uninst.exe”
SectionEnd

Section -Post
WriteUninstaller “KaTeX parse error: Expected 'EOF', got '\uninst' at position 8: INSTDIR\̲u̲n̲i̲n̲s̲t̲.exe" WriteRe…{PRODUCT_DIR_REGKEY}” “” “$INSTDIR\AnyAccess.exe”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “DisplayName” “$(^Name)”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “UninstallString” “$INSTDIR\uninst.exe”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “DisplayIcon” “$INSTDIR\AnyAccess.exe”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “DisplayVersion” “${PRODUCT_VERSION}”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “URLInfoAbout” “${PRODUCT_WEB_SITE}”
WriteRegStr P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}" “Publisher” “${PRODUCT_PUBLISHER}”
SectionEnd

Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK “$(^Name) 已成功地从你的计算机移除。”
FunctionEnd

Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 “你确实要完全移除 $(^Name) ,其及所有的组件?” IDYES +2
Abort
FunctionEnd

Section Uninstall
Delete “$INSTDIR${PRODUCT_NAME}.url”
Delete “KaTeX parse error: Expected 'EOF', got '\uninst' at position 8: INSTDIR\̲u̲n̲i̲n̲s̲t̲.exe" Delete …INSTDIR\softwares\yiwei4.ovpn”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\vnc_windows.ex…INSTDIR\softwares\stopvpn.bat”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\startvpn.vbs" …INSTDIR\softwares\startvpn.bat.bak”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\startvpn.bat" …INSTDIR\softwares\startop.vbs”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\openvpn.exe" …INSTDIR\softwares\libssl-1_1.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\libpkcs11-help…INSTDIR\softwares\liblzo2-2.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\softwares' at position 8: INSTDIR\̲s̲o̲f̲t̲w̲a̲r̲e̲s̲\libcrypto-1_1.…INSTDIR\QtWebKit4.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\QtSqld' at position 8: INSTDIR\̲Q̲t̲S̲q̲l̲d̲4.dll" Delete…INSTDIR\QtNetworkd4.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\QtNetwork' at position 8: INSTDIR\̲Q̲t̲N̲e̲t̲w̲o̲r̲k̲4.dll" Delete…INSTDIR\QtGuid4.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\QtGui' at position 8: INSTDIR\̲Q̲t̲G̲u̲i̲4.dll" Delete…INSTDIR\QtCored4.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\QtCore' at position 8: INSTDIR\̲Q̲t̲C̲o̲r̲e̲4.dll" Delete…INSTDIR\mingwm10.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\Map' at position 8: INSTDIR\̲M̲a̲p̲\deviceMap.html…INSTDIR\licence.txt”
Delete “KaTeX parse error: Expected 'EOF', got '\libjson' at position 8: INSTDIR\̲l̲i̲b̲j̲s̲o̲n̲.so" Delete "INSTDIR\libjson.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\libjson' at position 8: INSTDIR\̲l̲i̲b̲j̲s̲o̲n̲.a" Delete "INSTDIR\libgcc_s_dw2-1.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\libcurldll' at position 8: INSTDIR\̲l̲i̲b̲c̲u̲r̲l̲d̲l̲l̲.a" Delete "INSTDIR\libcurl.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\libcurl' at position 8: INSTDIR\̲l̲i̲b̲c̲u̲r̲l̲.a" Delete "INSTDIR\jsoncpplib\jsoncpp.lib”
Delete “KaTeX parse error: Expected 'EOF', got '\json' at position 8: INSTDIR\̲j̲s̲o̲n̲\lib\libjson.so…INSTDIR\json\lib\libjson.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\json' at position 8: INSTDIR\̲j̲s̲o̲n̲\lib\libjson.a"…INSTDIR\IEShims.dll”
Delete “KaTeX parse error: Expected 'EOF', got '\configure' at position 8: INSTDIR\̲c̲o̲n̲f̲i̲g̲u̲r̲e̲.ini" Delete …INSTDIR\app.ico”
Delete “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 8: INSTDIR\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲_zh.ts" Delet…INSTDIR\AnyAccess_zh.qm”
Delete “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 8: INSTDIR\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲.iss" Delete …INSTDIR\AnyAccess.exe”

Delete “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 11: SMPROGRAMS\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲\Uninstall.lnk"…SMPROGRAMS\AnyAccess\Website.lnk”
Delete “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 8: DESKTOP\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲.lnk" Delete …SMPROGRAMS\AnyAccess\AnyAccess.lnk”

RMDir “KaTeX parse error: Expected 'EOF', got '\AnyAccess' at position 11: SMPROGRAMS\̲A̲n̲y̲A̲c̲c̲e̲s̲s̲" RMDir "INSTDIR\softwares”
RMDir “KaTeX parse error: Expected 'EOF', got '\Map' at position 8: INSTDIR\̲M̲a̲p̲" RMDir "INSTDIR\jsoncpplib”
RMDir “KaTeX parse error: Expected 'EOF', got '\json' at position 8: INSTDIR\̲j̲s̲o̲n̲\lib" RMDir "INSTDIR”

DeleteRegKey P R O D U C T U N I N S T R O O T K E Y " {PRODUCT_UNINST_ROOT_KEY} " {PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM “${PRODUCT_DIR_REGKEY}”
SetAutoClose true
SectionEnd

3、注意事项
经过以上的步骤,大家都可以很轻松的打包一个软件了。是不是比较神奇。以前觉得很厉害的东西,现在看来只要掌握了方法还是很简答的对吧。不过,你真的完全掌握了么?
现在在这里讲了,将来也许还会有人按照我写的这篇来做软件的打包(我感到十分的荣幸,知识能够传递下去),不过你在顺利的执行了打包的流程,生成了一个带着自定义图标的打包软件,然后满心欢喜的去执行这个安装包的时候发现,桌面上生成的那个快捷方式的图标仍然是系统默认的图标,丑陋不堪,试了一些方法可能也没有解决这个问题,内心开始烦躁,甚至厌恶这个打包软件起来。设置,你肯定疑惑的内心嘀咕着,这个作者是骗人的,根本就不可能生成自定义的那个图标。
哈哈!你终于落入陷阱中啦。
那个,这个问题到底是怎么引起的?又该如何解决呢?截止到发布这篇文章,我对NisEdit基于这个问题产生的原因,我个人认为是NisEdit程序不够完善导致的,毕竟不是开源,我也没有办法去针对这个问题优化(如果开源的话,我相信早就有大神去解决这个问题了)。
那么,如何解决呢?细心的读者肯定会看到,我再打包前准备的可执行程序是带图标的(eg:AnyAccess.exe),是不是因为这个原因呢?你猜对了,经过多次的尝试吗,我发现确实是这个原因到导致的。当使用带图标的可执行程序进行打包时,最终安装软件生成的可执行程序也可以带自定义的图标,完美!
那么,接下来会有读者问,那带图标的exe程序是怎么产生的呢,或者说是怎么设置才生成的。既然话都到这个份上了,也没有必要掖着藏着啦。那么,下面以Qt为例子,教大家发布一个带自定义图标的exe程序。
首先,在工程目录下新建一个appicon.rc的资源文件,在资源文件中编写以下代码:
IDI_ICON ICON DISCARDABLE “images/app.ico”
需要说明的是,"images/app.ico"是图标的相对路径,这里根据实际情况进行设置。
然后,在工程中,将appicon.rc文件添加到项目中,在.pro工程文件中会生成以下语句,当然,直接在.pro文件中添加一下语句可以的.
DISTFILES +=
appicon.rc
RC_FILE += appicon.rc
重现qmake,然后构建和运行程序,你会发现在Release目录下生成了一个跟app.ico图标一样的可执行程序。
至此,问题完美解决。是不是也很简单的说。当然,如果使用其他IDE开发程序,在遇到这个问题时,解决的方法也大同小异,这里不做过多的赘述。

二、Inno Setup Complier(5.5.9)软件制作安装包

1、Inno Setup Complier介绍
在这里插入图片描述
相对于NisEdit软件,这个软件并没有提供简单粗暴,易学易上手的向导功能。如果要想顺利的打包一个软件,学习脚本语法知识看看来是不可避免的了。好在软件提过了几个简单易学的deamon,只要用点心,相信大家可以很快的掌握基础的脚本语法知识。
2、脚本基础
这里,也不需要用过多的篇幅跟大家介绍软件的使用了。因为只需要一个按钮就可以,写完脚本,点击运行,有错误根据调试窗体的提示信息该bug,万事大吉,可以生成一个exe的可执行文件。如何生成带图标的exe,上面已经做过简单的介绍了。
下面,带大家一起简单的看看这个脚本。当然,我们仍然以AnyAccess这个软件为例.
; – AnyAccess.iss –

#define MyAppName “AnyAccess”
#define MyAppVersion “1.00.00.00.00”
#define MyAppPublisher “武汉亿维自动化技术有限公司”
#define MyAppURL “http://www.unimat.com.cn
#define MyAppExeName “AnyAccess.exe”

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\UniMAT{#MyAppName}
DefaultGroupName=UniMAT{#MyAppName}
UninstallDisplayIcon={{app}{#MyAppExeName}
Compression=lzma2
SolidCompression=yes
;生成的打包文件的路径
OutputDir=F:\AnyAccess\package\AnyAccess_PACKAGE_VERSION

[Tasks]
Name: “desktopicon”; Description: “{cm:CreateDesktopIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: checkablealone
;OnlyBelowVersion: 0,6.1
Name: “quicklaunchicon”; Description: “{cm:CreateQuickLaunchIcon}”; GroupDescription: “{cm:AdditionalIcons}”; Flags: checkablealone

[Files]
;Source: “MyProg.exe”; DestDir: “{app}”
;Source: “MyProg.chm”; DestDir: “{app}”
;Source: “Readme.txt”; DestDir: “{app}”; Flags: isreadme

Source: “F:\AnyAccess\package\AnyAccess_PACKAGE_VERSION\AnyAccess.exe”; DestDir: “{app}”; Flags: ignoreversion
Source: “F:\AnyAccess\package\AnyAccess_PACKAGE_VERSION*”; DestDir: “{app}”; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”

[Icons]
;Name: “{group}\My Program”; Filename: “{app}\MyProg.exe”
Name: “{group}{#MyAppName}”; Filename: “{app}{#MyAppExeName}”
Name: “{group}{cm:UninstallProgram,{#MyAppName}}”; Filename: “{uninstallexe}”
Name: “{commondesktop}{#MyAppName}”; Filename: “{app}{#MyAppExeName}”; Tasks: desktopicon
Name: “{userappdata}\Microsoft\Internet Explorer\Quick Launch{#MyAppName}”; Filename: “{app}{#MyAppExeName}”; Tasks: quicklaunchicon

[Run]
Filename: “{app}{#MyAppExeName}”; Description: “{cm:LaunchProgram,{#StringChange(MyAppName, ‘&’, ‘&&’)}}”; Flags: nowait postinstall skipifsilent

[Registry]
; 软件版本写入注册表
Root: HKLM; Subkey: Software\UniMAT\AnyAccess; ValueType: string; ValueName: Installed version; ValueData: {#MyAppVersion}; Flags: uninsdeletekey ;
Root: HKCR; Subkey: “anyaccessfile\DefaultIcon”; ValueType: string; ValueName: “”; ValueData: “{app}\AnyAccess.exe,0”; Flags: uninsdeletekey
Root: HKCR; Subkey: “anyaccessfile\Shell\Open\Command”; ValueType: string; ValueName: “”; ValueData: “”"{app}\AnyAccess.exe"" “”%1"""; Flags: uninsdeletekey

[Code]
var
ErrorCode : Integer;
IsRunning : Integer;
InstalledVersion: String;
PrevVer : String;

// 获取已经安装的版本信息
function GetInstalledVersion(): String;
begin
InstalledVersion :=’’;
RegQueryStringValue(HKLM, ‘Software\UniMAT\AnyAccess’, ‘Installed version’, InstalledVersion);
Result := InstalledVersion;
end;

//判断程序是否运行
function IsAppRunning(const FileName : string): Boolean;
var
FSWbemLocator: Variant;
FWMIService : Variant;
FWbemObjectSet: Variant;
begin
Result := false;
FSWbemLocator := CreateOleObject(‘WBEMScripting.SWBEMLocator’);
FWMIService := FSWbemLocator.ConnectServer(’’, ‘root\CIMV2’, ‘’, ‘’);
FWbemObjectSet := FWMIService.ExecQuery(Format(‘SELECT Name FROM Win32_Process Where Name="%s"’,[FileName]));
Result := (FWbemObjectSet.Count > 0);
FWbemObjectSet := Unassigned;
FWMIService := Unassigned;
FSWbemLocator := Unassigned;
end;

// 安装时判断客户端是否正在运行,并检测程序是否安装
function InitializeSetup(): Boolean;
begin
Result := true; //安装程序继续
if IsAppRunning(‘AnyAccess.exe’) then
begin
IsRunning := 1;
end else begin
IsRunning := 0;
end
while IsRunning<>0 do
begin
if Msgbox(‘安装程序时检测到客户端正在运行。’#13#13’您必须先关闭它然后单击“是”继续安装,或按“否”退出!’, mbConfirmation, MB_YESNO) = idNO then
begin
Result := false; //安装程序退出
IsRunning := 0;
end else begin
Result := true; //安装程序继续
if IsAppRunning(‘AnyAccess.exe’) then
begin
IsRunning := 1;
end else begin
IsRunning := 0;
end
end;
end;
end;

// 卸载时判断客户端是否正在运行
function InitializeUninstall(): Boolean;
begin
Result := true; // 卸载程序继续
if IsAppRunning(‘AnyAccess.exe’) then
IsRunning := 0;
while IsRunning<>0 do
begin
if Msgbox(‘卸载程序时检测到客户端正在运行。’#13#13’您必须先关闭它然后单击“是”继续卸载,或按“否”退出!’,mbConfirmation, MB_YESNO) = idNO then
begin
Result := false; // 卸载程序退出
IsRunning := 0;
end else begin
Result := true; // 卸载程序继续
if IsAppRunning(‘AnyAccess.exe’) then
IsRunning := 0;
end;
end;
end;

看完上面的程序,是不是觉得其实也没想象的那么难呢。
ok,软件的打包这一章到此结束。能力有限,存在错误请不要吐槽。哈!

猜你喜欢

转载自blog.csdn.net/weixin_39568531/article/details/84642971