[Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
来源:互联网 发布:java怎么打成jar 编辑:程序博客网 时间:2024/04/30 20:33
最近安排我弄程序的打包工作,然后叫我接触Inno Setup打包软件。
说实话,第一次弄,什么都不懂,就不断Baidu,当然很多都没有,只有看文档了!
前面打包程序部分都还好,都完成了,但是后来说要捆绑组建,这个可把我难住了,最开始我是把组建添加进去,然后安装程序后启动组建安装,这样的缺陷多的数不清。
而后,把组建捆绑到tmp中安装,但是也是存在问题,因为用户要是在安装过程中取消了,那自己的程序也没法跑了!
而后又加入了组建的安装检测,在最后一步的时候检测是否正确安装(通过扫描注册表),假如成功则完成,假如不成功则启动程序删除!
这样基本解决了,但是感觉好麻烦,好累赘!
而后又想到了,为什么不在开始就检测呢,如果没有则安装,安装失败则退出整个程序安装!
而后就开始了我的一点点的改动,完成。
最后代码如下:
[Files]Source: "NET2.exe"; DestDir: "{tmp}"; Flags: ignoreversion
[code]function NeedInstallDotNet(): Boolean;var success: boolean; install: cardinal;begin success := RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727', 'Install', install); Result := not(success and (install = 1));end; function InitializeSetup(): Boolean;var ResultCode: Integer; begin Result :=true; if (NeedInstallDotNet) then begin MsgBox('您的电脑需要先安装Microsoft .NET Framework 2.0 SP2组建.' + #13 + '请等待组建加载完成并完成组建安装后再进行程序的安装.',mbError, MB_OK); ExtractTemporaryFile('NET2.exe'); Exec(ExpandConstant('{tmp}\NET2.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); end; if (NeedInstallDotNet) then begin MsgBox('您的组建安装失败,程序将退出安装.',mbError, MB_OK); Result :=false; //安装程序退出 end else begin Result :=true; //安装程序继续 end;end;
完整的项目:
; Script generated by the Inno Setup Script Wizard.; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!#define MyCompany "Broadinter"#define MyAppName "Prober"#define MyAppVersion "3.0.0"#define MyAppPublisher "Broadinter, Inc."#define MyAppURL "http://www.broadinter.com/"#define MyAppId "{55E402DD-B073-4CDF-8AA7-D52FDC5B348E}"#define MyAppServeKiwi "kiwi.exe"#define MyAppServeWatchdog "kiwi_watchdog.exe"#define MyFormationDotNetName "NetFx20SP2_x86.exe" [Setup]; NOTE: The value of AppId uniquely identifies this application.; Do not use the same AppId value in installers for other applications.; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)AppId={{#MyAppId}AppName={#MyAppName}AppVersion={#MyAppVersion}AppPublisher={#MyAppPublisher}AppPublisherURL={#MyAppURL}AppSupportURL={#MyAppURL}AppUpdatesURL={#MyAppURL}AppCopyright=Copyright (C) 2013 {#MyAppPublisher}DefaultDirName={pf}\{#MyCompany}DefaultGroupName={#MyCompany}AllowNoIcons=yesLicenseFile=eula.rtfOutputDir=..\SetupOutputBaseFilename=setupSetupIconFile=setup.icoCompression=lzmaSolidCompression=yesPrivilegesRequired=adminWizardImageFile=Image.bmpWizardSmallImageFile=SmallImage.bmp [Languages]Name: "chinesesimplified"; MessagesFile: "ChineseSimplified.isl"[Files]Source: "..\Source\Prober\*"; DestDir: "{app}\Prober"; Flags: ignoreversion recursesubdirs createallsubdirs;Source: "..\Source\Selections\network.conf"; DestDir: "{app}\Prober"; Flags: ignoreversion onlyifdoesntexist uninsneveruninstall; Check: NeedInstallNetworkConfig;Source: "..\Source\Selections\probe.conf"; DestDir: "{app}\Prober"; Flags: ignoreversion onlyifdoesntexist uninsneveruninstall; Check: NeedInstallProbeConfig; AfterInstall: MyAfterInstall;Source: "..\Source\Prober_Update\*"; DestDir: "{app}\Prober_Update"; Flags: ignoreversion recursesubdirs createallsubdirs; Source: "..\Source\Prober_Watchdog\*"; DestDir: "{app}\Prober_Watchdog"; Flags: ignoreversion recursesubdirs createallsubdirs; Source: "..\Source\Selections\NetFx20SP2_x86.exe"; DestDir: "{tmp}"; Flags: ignoreversion; Check: NeedInstallDotNet;Source: "..\Source\Selections\IE8-WindowsServer2003-x86-CHS.exe"; DestDir: "{tmp}"; Flags: ignoreversion; Check: NeedInstallIE;Source: "..\Source\Selections\Flashplayer11_7r700_202_winax.exe"; DestDir: "{tmp}"; Flags: ignoreversion; Check: NeedInstallFlash;[Run]Filename: "{app}\Prober\{#MyAppServeKiwi}"; Parameters: "-i Prober"; WorkingDir: "{app}\Prober"; StatusMsg: "正在安装Prober服务..."; BeforeInstall: BeforeInstallDelete;Filename: "{app}\Prober\{#MyAppServeKiwi}"; Parameters: "-s Prober"; WorkingDir: "{app}\Prober"; StatusMsg: "正在开启Prober服务..."Filename: "{app}\Prober_Watchdog\{#MyAppServeWatchdog}"; Parameters: "-i Prober_Watchdog"; WorkingDir: "{app}\Prober_Watchdog"; StatusMsg: "正在安装Prober_Watchdog服务..."Filename: "{app}\Prober_Watchdog\{#MyAppServeWatchdog}"; Parameters: "-s Prober_Watchdog"; WorkingDir: "{app}\Prober_Watchdog"; StatusMsg: "正在开启Prober_Watchdog服务..."Filename: "{tmp}\IE8-WindowsServer2003-x86-CHS.exe"; Parameters: " "; WorkingDir: "{tmp}"; StatusMsg: "正在安装IE8..."; Check: NeedInstallIEFilename: "{tmp}\Flashplayer11_7r700_202_winax.exe"; Parameters: "/install"; WorkingDir: "{tmp}"; StatusMsg: "正在安装Flashplayer11..."; Check: NeedInstallFlash[UninstallRun]Filename: "{app}\Prober\{#MyAppServeKiwi}"; Parameters: "-p Prober"; WorkingDir: "{app}\Prober"; StatusMsg: "正在停止Prober服务"Filename: "{app}\Prober\{#MyAppServeKiwi}"; Parameters: "-u Prober"; WorkingDir: "{app}\Prober"; StatusMsg: "正在卸载Prober服务"Filename: "{app}\Prober_Watchdog\{#MyAppServeWatchdog}"; Parameters: "-p Prober_Watchdog"; WorkingDir: "{app}\Prober_Watchdog"; StatusMsg: "正在停止Prober_Watchdog服务"Filename: "{app}\Prober_Watchdog\{#MyAppServeWatchdog}"; Parameters: "-u Prober_Watchdog"; WorkingDir: "{app}\Prober_Watchdog"; StatusMsg: "正在卸载Prober_Watchdog服务"[Code]var //探针配置页面 UserPage: TInputQueryWizardPage; //是否运行了卸载 IsUninstallRuned: Boolean; //是否保存配置文件 IsSaveConfig: Boolean; //配置属性 ConfigBool: Boolean; //CheckBox CB_IE: TNewCheckBox; CB_Flash: TNewCheckBox;{--检检测是否已经安装软件--}function CheckHaveApp(): Boolean;var ResultStr: String; ResultCode: Integer;begin if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', ResultStr) then begin if (MsgBox('检测到你已安装本软件,是否卸载?', mbConfirmation, MB_YESNO) = IDYES) then begin ResultStr := RemoveQuotes(ResultStr); Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); //二次检测是否卸载 if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', ResultStr) then begin result:=false; end else begin result:=true; end; end; end else begin result:=true; end;end;{--检测是否需要安装NET组建--}function NeedInstallDotNet(): Boolean;var success: boolean; install: cardinal;begin success := RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727', 'Install', install); Result := not(success and (install = 1));end;{--检测是否需要IE组建--}function NeedInstallIE(): Boolean;begin Result := CB_IE.Checked;end;{--检测是否需要Flash组建--}function NeedInstallFlash(): Boolean;begin Result := CB_Flash.Checked;end;{--检测是否需要安装Network配置文件--}function NeedInstallNetworkConfig(): Boolean;begin if FileExists(ExpandConstant('{app}') + '\Prober\network.conf') then begin Result := False; end else begin Result := True; end;end;{--检测是否需要安装Probe配置文件--}function NeedInstallProbeConfig(): Boolean;begin if FileExists(ExpandConstant('{app}') + '\Prober\probe.conf') then begin Result := False; end else begin Result := True; end;end;{--检检测是否已经IE8--}function CheckHaveIE8(): Boolean;var ResultStr: String; ResultCode: Integer;begin RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Internet Explorer', 'Version', ResultStr); if ResultStr = '8.0.6001.18702' then begin result := False; end else begin result := True; end;end;{--启动服务前删除多余数据--}procedure BeforeInstallDelete();var whileLen: Integer;begin whileLen := 0; while whileLen <> 5 do begin if(FileExists(ExpandConstant('{app}') + '\Prober\probe.db')) then begin DeleteFile(ExpandConstant('{app}'+ '\Prober\probe.db')); whileLen:= whileLen+1; end else begin whileLen := 5; end; end; if(FileExists(ExpandConstant('{app}') + '\Prober\probe.db')) then begin MsgBox('文件“\Prober\probe.db”清理失败!',mbError, MB_OK); end; DelTree(ExpandConstant('{app}'+ '\Prober\log'), True, True, True); DelTree(ExpandConstant('{app}'+ '\Prober\mq_ext'), True, True, True);end;{--开始前检测--}function InitializeSetup(): boolean;var ResultStr: String; ResultCode: Integer; whileLen: Integer;begin CheckHaveIE8; //是否已经安装本软件 whileLen := 0; while whileLen <> 3 do begin if(CheckHaveApp) then begin result:=true; whileLen := 3; end else begin result:=false; whileLen:= whileLen+1; end; end; //是否需要组建 if(result) then begin if (NeedInstallDotNet) then begin MsgBox('您的电脑需要先安装Microsoft .NET Framework 2.0 SP2组建.' + #13 + '请等待组建加载完成并完成组建安装后再进行程序的安装.',mbError, MB_OK); ExtractTemporaryFile('{#MyFormationDotNetName}'); Exec(ExpandConstant('{tmp}\{#MyFormationDotNetName}'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); end; if (NeedInstallDotNet) then begin MsgBox('您的组建安装失败,程序将退出安装.',mbError, MB_OK); Result :=false; //安装程序退出 end else begin Result :=true; //安装程序继续 end; end;end;{-- 创建插件页面 --}procedure CreateTheWizardPages;var Page: TWizardPage; Button, FormButton: TNewButton; Panel: TPanel; HaveIE8Bool: Boolean;begin Page := CreateCustomPage(wpWelcome, '插件安装', '请选择您需要安装的插件'); HaveIE8Bool := CheckHaveIE8; CB_IE := TNewCheckBox.Create(Page); CB_IE.Top := ScaleY(35); CB_IE.Left := ScaleY(40); CB_IE.Width := Page.SurfaceWidth div 2; CB_IE.Height := ScaleY(17); CB_IE.Caption := '安装IE8插件'; CB_IE.Checked := HaveIE8Bool; CB_IE.Enabled := HaveIE8Bool; CB_IE.Parent := Page.Surface; CB_Flash := TNewCheckBox.Create(Page); CB_Flash.Top := CB_IE.Top + CB_IE.Height + ScaleY(8); CB_Flash.Left := ScaleY(40); CB_Flash.Width := Page.SurfaceWidth div 2; CB_Flash.Height := ScaleY(17); CB_Flash.Caption := '安装Flashplayer11插件'; CB_Flash.Checked := True; CB_Flash.Parent := Page.Surface;end;{--- 页面初始化 --}procedure InitializeWizard;begin {-- 创建插件页 --} CreateTheWizardPages; {-- 创建配置页 --} UserPage := CreateInputQueryPage(wpReady, '配置', '请进行如下配置,然后进入下一步', '请确保填写正确的信息'); UserPage.Add('服务端IP', False); UserPage.Add('监测点ID', False); ConfigBool := True;end;{-- 下一步按钮事件响应 --}function NextButtonClick(CurPageID: Integer): Boolean;begin Result := True; if CurPageID = UserPage.ID then begin if UserPage.Values[0] = '' then begin MsgBox('请填写服务端IP', mbError, MB_OK); Result := False; end else if UserPage.Values[1] = '' then begin MsgBox('请填写监测点ID', mbError, MB_OK); Result := False; end; end; if CurPageID = wpReady then begin if FileExists(ExpandConstant('{app}') + '\Prober\network.conf') and FileExists(ExpandConstant('{app}') + '\Prober\probe.conf') then begin ConfigBool := False; end; end;end;{-- 页面跳转时 实现是否允许跳转 --}function ShouldSkipPage(PageID: Integer): Boolean;begin Result := False; if PageID = UserPage.ID then begin if ConfigBool = False then begin Result := True; end; end;end;{-- 去字符串空格 --}function StringTrim(a: string): string;begin Result := a; while pos(' ',Result)<>0 do delete(Result,pos(' ',Result),1);end;{-- 方法: 实现对配置文件拷贝后进行处理 --}procedure MyAfterInstall();var XMLDoc0: Variant; XMLDoc1: Variant; s: string; begin if ConfigBool then begin try XMLDoc0 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc0.async := False; XMLDoc0.resolveExternals := False; XMLDoc0.load(ExpandConstant('{app}') + '\Prober\network.conf'); XMLDoc0.selectSingleNode('//channel[@name=''balance'']').attributes.getNamedItem('peer_addr').text := StringTrim(UserPage.Values[0]); XMLDoc0.save(ExpandConstant('{app}') + '\Prober\network.conf'); except RaiseException('未能正确配置服务端IP,请检查network.conf'); end; try XMLDoc1 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc1.async := False; XMLDoc1.resolveExternals := False; XMLDoc1.load(ExpandConstant('{app}') + '\Prober\probe.conf'); XMLDoc1.selectSingleNode('//mid').text := StringTrim(UserPage.Values[1]); XMLDoc1.save(ExpandConstant('{app}') + '\Prober\probe.conf'); except RaiseException('未能正确配置监测点ID,请检查probe.conf'); end; end;end;{-- 卸载程序时对用户是否保留插件 --}procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);var XMLDoc0: Variant; XMLDoc1: Variant; begin //进入卸载后改变状态 IsUninstallRuned := true; if CurUninstallStep = usUninstall then begin if MsgBox('是否需要保留配置文件?', mbConfirmation, MB_YESNO) = IDYES then begin IsSaveConfig := True; try XMLDoc0 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc0.async := False; XMLDoc0.resolveExternals := False; XMLDoc0.load(ExpandConstant('{app}') + '\Prober\network.conf'); XMLDoc0.save(ExpandConstant('{app}') + '\Prober\network_tmp.conf'); XMLDoc1 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc1.async := False; XMLDoc1.resolveExternals := False; XMLDoc1.load(ExpandConstant('{app}') + '\Prober\probe.conf'); XMLDoc1.save(ExpandConstant('{app}') + '\Prober\probe_tmp.conf'); except end; end else begin IsSaveConfig := False; end; end;end;{-- 删除后操作 对文件进行一定的处理 --}procedure DeinitializeUninstall();var XMLDoc0: Variant; XMLDoc1: Variant;begin //首先判断是否进入了卸载 if IsUninstallRuned then begin if IsSaveConfig then begin try DeleteFile(ExpandConstant('{app}'+ '\Prober\probe.db')); DelTree(ExpandConstant('{app}'+ '\Prober\log'), True, True, True); DelTree(ExpandConstant('{app}'+ '\Prober\mq_ext'), True, True, True); DelTree(ExpandConstant('{app}'+ '\Prober_Update'), True, True, True); DelTree(ExpandConstant('{app}'+ '\Prober_Watchdog'), True, True, True); except MsgBox('清空程序日志及数据库缓存失败!', mbInformation, MB_OK); end; try XMLDoc0 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc0.async := False; XMLDoc0.resolveExternals := False; XMLDoc0.load(ExpandConstant('{app}') + '\Prober\network_tmp.conf'); XMLDoc0.save(ExpandConstant('{app}') + '\Prober\network.conf'); XMLDoc1 := CreateOleObject('MSXML2.DOMDocument'); XMLDoc1.async := False; XMLDoc1.resolveExternals := False; XMLDoc1.load(ExpandConstant('{app}') + '\Prober\probe_tmp.conf'); XMLDoc1.save(ExpandConstant('{app}') + '\Prober\probe.conf'); except MsgBox('保留配置文件失败!', mbInformation, MB_OK); end; try DeleteFile(ExpandConstant('{app}'+ '\Prober\network_tmp.conf')); DeleteFile(ExpandConstant('{app}'+ '\Prober\probe_tmp.conf')); except MsgBox('清空配置文件缓存失败!', mbInformation, MB_OK); end; end else begin DelTree(ExpandConstant('{app}'), True, True, True); end; end;end;
0 0
- [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
- 一个相对完整的inno setup 脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 一个比较完整的Inno Setup 安装脚本
- 比较完整的Inno Setup 安装脚本
- Inno Setup的使用笔记
- win7 x64 下VC6的调试程序无法退出的问题解决方法
- *.tar.gz文件包安装
- win7下架设IIS其他电脑无法访问的解决办法
- 解决MSSQL 2008不能用IP登录的问题
- Hibernate 4中buildSessionFactory()过时
- [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
- 职场人要远离的各种“负能量”
- FileZilla 帐号密码
- 判断数据库表是否存在,删除再创建
- Relevance Ranking: from Web Search to Vertical Search 报告
- IOS面经系列(一)浅析OC之内存管理
- 突破思维的障碍
- memcached启动过程2(改用自己的语言来叙述)
- Qt出现错误“undefined reference to `vtable for XXXXX.XXX”