(自定义卸载)
INNO Setup 使用笔记
[Setup] AppName={#MyAppName} AppVerName={#MyAppVerName} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}/My Programee DefaultGroupName={#MyAppName} InfoBeforeFile=D:/Inno Setup 5/Examples/Readme.txt 安装前的查看信息 InfoAfterFile=D:/Inno Setup 5/Examples/Readme-German.txt 安装后的查看信息 OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Run] 安装结束后要运行的选项 Filename: "{app}/MyProg.EXE" (直接运行不提示,没有可选) [Icons](快捷方式) Name: "{commonprograms}/My Program"; Filename: "{app}/MyProg.exe" (在程序的快捷方式) Name: "{userdesktop}/My Program"; Filename: "{app}/MyProg.exe" (在桌面快捷方式) Name: "{group}/My Program"; Filename: "{app}/MyProg.exe" ({group}/My Program 快捷方式名 后面是对应的程序 ) Commonprograms 程序菜单 Userdesktop 桌面 Group程序菜单的文件夹里 [Files] Source: "MyProg.exe"; DestDir: "{app}" Source: "MyProg.hlp"; DestDir: "{app}"; Flags: isreadme ( Flags: isreadme 安装结束后要读的选项) Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme Source: MyDll.dll; DestDir: {app}; Flags: ignoreversion; (调用自定义的函数) [Registry] 注册表内容 Root: HKCU; Subkey: "Software/My Company"; Flags: uninsdeletekeyifempty Root: HKCU; Subkey: "Software/My Company/My Program"; Flags: uninsdeletekey Root: HKCU; Subkey: "Software/My Company/My Program/Settings"; ValueType: string; ValueName: "Name"; ValueData: "{code:GetUser|Name}" Root: HKCU; Subkey: "Software/My Company/My Program/Settings"; ValueType: string; ValueName: "Company"; ValueData: "{code:GetUser|Company}" Root: HKCU; Subkey: "Software/My Company/My Program/Settings"; ValueType: string; ValueName: "DataDir"; ValueData: "{code:GetDataDir}" [code] 自定义安装界面 不区分大小写 [Setup] AppName=My Program AppVerName=My Program version 1.5 CreateAppDir=no DisableProgramGroupPage=yes DefaultGroupName=My Program UninstallDisplayIcon={app}/MyProg.exe [Code] procedure WordButtonOnClick(Sender: TObject); var Word: Variant; begin MsgBox('WORD', mbInformation, mb_Ok); end; procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent); begin with TButton.Create(WizardForm) do begin Left := ALeft; Top := ATop; Width := WizardForm.CancelButton.Width; Height := WizardForm.CancelButton.Height; Caption := ACaption; OnClick := ANotifyEvent; Parent := WizardForm.WelcomePage; end; end; procedure InitializeWizard(); var Left, Top, TopInc: Integer; begin Left := WizardForm.WelcomeLabel2.Left; TopInc := WizardForm.CancelButton.Height + 8; Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc; CreateButton(Left, Top, '&Word...', @WordButtonOnClick); ;要先定义后使用 end; 页面变量 TInputFileWizardPage TInputQueryWizardPage TInputOptionWizardPage //下一步按钮的函数function NextButtonClick(CurPageID: Integer): Boolean;beginResult := true;endfunction BackButtonClick(CurPageID: Integer): Boolean;beginResult := true; end;文件操作:function RenameFile(const OldName, NewName: string): Boolean; function DeleteFile(const FileName: string): Boolean; function DelTree(const Path: String; const IsDir, DeleteFiles, DeleteSubdirsAlso: Boolean): Boolean创建页面function CreateInputDirPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; AAppendDir: Boolean; ANewFolderName: String): TInputDirWizardPage; function CreateInputFilePage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputFileWizardPage;function CreateInputOptionPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; Exclusive, ListBox: Boolean): TInputOptionWizardPage; function CreateInputQueryPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputQueryWizardPage; function CreateOutputMsgMemoPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption, AMsg: String): TOutputMsgMemoWizardPage; function CreateOutputMsgPage(const AfterID: Integer; const ACaption, ADescription, AMsg: String): TOutputMsgWizardPage;inno setup 技巧[code]procedure InitializeWizard();beginWizardForm.LICENSEACCEPTEDRADIO.Checked := true;end;2、自定义安装程序右上角图片大小 [code]procedure InitializeWizard();beginWizardForm.WizardSmallBitmapImage.width:=150; //设置页眉图片的大小WizardForm.WizardSmallBitmapImage.left:=WizardForm.width-150; //设置左边页眉留出的空隙WizardForm.PAGENAMELABEL.width:=0; //设置标题文字显示的大小WizardForm.PAGEDESCRIPTIONLABEL.width:=0; //设置标题文字显示的大小end;或者//自定义安装向导小图片 [code]procedure InitializeWizard();beginWizardform.WizardSmallBitmapImage.left:= WizardForm.width-164; //自定义安装向导小图片显示位置WizardForm.WizardSmallBitmapImage.width:=164; //自定义安装向导小图片宽度Wizardform.PageNameLabel.width:= 495 - 164 -36; //这儿必须定义,数值根据图片宽度更改,显示软件名称的位置Wizardform.PageDescriptionLabel.width:= 495 - 164 -42; //显示页面信息的位置end;3、自定义BeveledLabel显示代码 [code]procedure InitializeWizard();beginWizardForm.BeveledLabel.Enabled:=true; //允许显示WizardForm.BeveledLabel.Font.Color:=$00058451;; //显示颜色WizardForm.BeveledLabel.Font.Style := WizardForm.BeveledLabel.Font.Style + [fsBold]; //显示字体WizardForm.BeveledLabel.Left:=5; //显示位置end;4、自定义安装向导图片 [code]procedure InitializeWizard();beginWizardform.WELCOMELABEL1.left:= 18; //自定义欢迎页面标题1显示位置Wizardform.WELCOMELABEL2.left:= 18; //自定义欢迎页面标题2显示位置Wizardform.WizardBitmapImage.left:= WizardForm.width-164 //自定义安装向导图片显示位置(显示大小,此处为居右显示)end;5、显示出组件选择框 [Types]Name: full; Description: 推荐Name: default; Description: 典型Name: custom; Description: 自定义; Flags: iscustom;告诉安装程序这个类型是自定义类型。必须定义iscustom这个参数,才能显示出组件选择框6、定义[Messages]的颜色 [code]procedure InitializeWizard();beginWizardForm.BeveledLabel.Enabled:= True;WizardForm.BeveledLabel.Font.Color:= clblue;end;7、不显示一些特定的安装界面 [code]function ShouldSkipPage(PageID: Integer): Boolean; begin if PageID=wpReady then result := true; end;wpReady 是准备安装界面PageID查询 INNO帮助中的 Pascal 脚本: 事件函数常量预定义向导页 CurPageID 值wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished8、换行符号在 [Messages] 换行符号为%n在 MsgBox 中换行符号为 #13#10 //#13 为回车字符9、颜色代码(1)一个值形如 $bbggrr, 这里的 rr, gg 和 bb 指定了两位的亮度值(以十六进制表示)分别为红色,绿色和蓝色。(2)预定义的颜色名称:clBlack(黑色),clMaroon(暗红),clGreen(绿色),clOlive(橄榄绿),clNavy(深蓝),clPurple(紫色),clTeal(深青),clGray(灰色),clSilver(浅灰),clRed(红色),clLime(浅绿),clYellow(黄色),clBlue(蓝色),clFuchsia(紫红),clAqua(青绿),clWhite(白色)。10、inno代码注释符号; 实例 —— ; 分号 // 实例 —— // 双斜杠 多用在code段{ } 实例 —— {大括号 多用在code段}注释符号均在英文输入法状态下输入11、在运行卸载程序前显示弹出式消息 [code]function InitializeUninstall(): Boolean;beginif MsgBox('', mbConfirmation, MB_YESNO) = IDYES thenresult:=trueelseresult:=false;end;12、安装、卸载时判断是否程序正在运行,卸载完成时自动打开网页 [code]varErrorCode: Integer;IsRunning: Integer;// 安装时判断客户端是否正在运行 function InitializeSetup(): Boolean; begin Result :=true; //安装程序继续 IsRunning:=FindWindowByWindowName('东方宽频网络电视'); while IsRunning<>0 do begin if Msgbox('安装程序检测到客户端正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then begin Result :=false; //安装程序退出 IsRunning :=0; end else begin Result :=true; //安装程序继续 IsRunning:=FindWindowByWindowName('东方宽频网络电视'); end; end; end; // 卸载时判断客户端是否正在运行 function InitializeUninstall(): Boolean; begin Result :=true; //安装程序继续 IsRunning:=FindWindowByWindowName('东方宽频网络电视'); while IsRunning<>0 do begin if Msgbox('安装程序检测到客户端正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then begin Result :=false; //安装程序退出 IsRunning :=0; end else begin Result :=true; //安装程序继续 IsRunning:=FindWindowByWindowName('东方宽频网络电视'); end; end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin case CurUninstallStep of usUninstall: begin // 开始卸载 end; usPostUninstall: begin // 卸载完成 // MsgBox('CurUninstallStepChanged:' #13#13 'Uninstall just finished.', mbInformation, MB_OK); // ...insert code to perform post-uninstall tasks here... ShellExec('open', 'http://www.dreams8.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); end; end; end; 13、 删除文件和删除文件夹 //删除文件 用 DeleteFile 只能删除一个文件,不能使用通配符来删除多个文件DeleteFile(ExpandConstant('{app}/abc.exe'));//删除所有文件及文件夹DelTree(ExpandConstant('{app}'), True, True, False);14、BorderStyleTFormBorderStyle = (bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin);无边界式(bsNone) ,单边固定式(bsSingle),双边可变式(bsSizeable),对话框式(bsDialog)15、if elsefunction NextButtonClick(CurPageID: Integer): Boolean; var ResultCode: Integer; begin Result := True; if (CurPageID = wpSelectDir) then begin MsgBox('AAAA', mbInformation, MB_OK); end else begin MsgBox('BBBB', mbInformation, MB_OK); end; end;16、安装结束界面增加“设为首页”选项[Tasks]Name: changestartpage; Description: "设置vistaqq为默认主页"[Registry]Root: HKCU; Subkey: "Software/Microsoft/Internet Explorer/Main"; ValueType: string; ValueName: "Start Page"; ValueData: "http://www.vistaqq.com"; tasks: changestartpage17、添加“关于”和网站链接按钮[Code]procedure URLLabelOnClick(Sender: TObject);varErrorCode: Integer;beginShellExec('open', 'http://www.vistaqq.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);end;procedure AboutButtonOnClick(Sender: TObject);beginMsgBox(#13 'Vista 状态条风格盘符' #13 #13'本软件由jinn制作,希望各位登陆中天VIP工作室!' #13#13 '版权所有 (C) 中天VIP工作室', mbInformation, MB_OK);end;varAboutButton, CancelButton: TButton;URLLabel: TNewStaticText;procedure InitializeWizard();begin{ Create the pages }WizardForm.PAGENAMELABEL.Font.Color:= clred;WizardForm.PAGEDESCRIPTIONLABEL.Font.Color:= clBlue;WizardForm.WELCOMELABEL1.Font.Color:= clGreen;WizardForm.WELCOMELABEL2.Font.Color:= clblack;CancelButton := WizardForm.CancelButton;AboutButton := TButton.Create(WizardForm);AboutButton.Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width;AboutButton.Top := CancelButton.Top;AboutButton.Width := CancelButton.Width;AboutButton.Height := CancelButton.Height;AboutButton.Caption := '&About';AboutButton.OnClick := @AboutButtonOnClick;AboutButton.Parent := WizardForm;URLLabel := TNewStaticText.Create(WizardForm);URLLabel.Caption := '中天VIP工作室';URLLabel.Cursor := crHand;URLLabel.OnClick := @URLLabelOnClick;URLLabel.Parent := WizardForm;{ Alter Font *after* setting Parent so the correct defaults are inherited first }URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];URLLabel.Font.Color := clBlue;URLLabel.Top := AboutButton.Top + AboutButton.Height - URLLabel.Height - 2;URLLabel.Left := AboutButton.Left + AboutButton.Width + ScaleX(20);end;18、去掉安装程序左上角“关于安装程序”的代码procedure InitializeWizard();beginWizardForm.BorderIcons:= [biMinimize];end;procedure CurPageChanged(CurPage: Integer);beginif CurPage=wpWelcome thenWizardForm.BorderIcons:= [biSystemMenu, biMinimize];end;或者procedure InitializeWizard();beginWizardForm.BORDERICONS := [biHelp, biSystemMenu, biMinimize];end;19、自定义BeveledLabel文字[Messages]BeveledLabel=中天VIP工作室20、自定义安装程序界面左上角“安装”文字[message]SetupAppTitle=需要的字SetupWindowTitle=需要的字21、自定义安装程序版本号VersionInfoVersion=1.1VersionInfoTextVersion=1.1-----------------------------------------------------------------------
[_ISTool]EnableISX=true[Setup]AppName=YourAppNameAppVerName=Your App Version 1.0.0MinVersion=4.1,4.0DefaultDirName={pf}\Your Default DirectoryDefaultGroupName=Your Default Group NameCompression=lzmaSolidCompression=trueOutputBaseFilename=Your Output File NameDisableDirPage=trueDisableProgramGroupPage=trueDisableReadyPage=falseDisableReadyMemo=true[Files]Source: C:\Program Files\ISTool\isxdl.dll; Flags: dontcopy[Messages]WinVersionTooLowError=YourAppName requires Windows 2000, Windows XP or later.[Icons]Name: {group}\Uninstall YourAppName; Filename: {uninstallexe}[Code]vardotnetRedistPath: string;downloadNeeded: boolean;dotNetNeeded: boolean;memoDependenciesNeeded: string;uninstaller: String;ErrorCode: Integer;procedure isxdl_AddFile(URL, Filename: PChar);external 'isxdl_AddFile@files:isxdl.dll stdcall';function isxdl_DownloadFiles(hWnd: Integer): Integer;external 'isxdl_DownloadFiles@files:isxdl.dll stdcall';function isxdl_SetOption(Option, Value: PChar): Integer;external 'isxdl_SetOption@files:isxdl.dll stdcall';constdotnetRedistURL = 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';constexeURL = 'http://www.pathtoyoursite.com/setup.exe';constmsiURL = 'http://www.pathtoyoursite.com/Installation.msi';function InitializeSetup(): Boolean;beginResult := true;dotNetNeeded := false;if not FileExists(ExpandConstant('{tmp}\setup.exe')) or not FileExists(ExpandConstant('{tmp}\Installation.msi')) thenbeginisxdl_AddFile(exeURL, ExpandConstant('{tmp}\setup.exe'));isxdl_AddFile(msiURL, ExpandConstant('{tmp}\Installation.msi'));downloadNeeded := true;end// See if the .NET Framework is already installedif (not RegKeyExists(HKLM, 'Software\Microsoft\.NETFramework\policy\v2.0')) then begindotNetNeeded := true;if (not IsAdminLoggedOn()) then beginMsgBox('YourAppName needs the Microsoft .NET Framework to be installed by an Administrator', mbInformation, MB_OK);Result := false;end else beginmemoDependenciesNeeded := memoDependenciesNeeded + ' .NET Framework' ;dotnetRedistPath := ExpandConstant('{src}\dotnetfx.exe');if not FileExists(dotnetRedistPath) then begindotnetRedistPath := ExpandConstant('{tmp}\dotnetfx.exe');if not FileExists(dotnetRedistPath) then beginisxdl_AddFile(dotnetRedistURL, dotnetRedistPath);downloadNeeded := true;end;end;SetIniString('install', 'dotnetRedist', dotnetRedistPath, ExpandConstant('{tmp}\dep.ini'));end;end;end;function NextButtonClick(CurPage: Integer): Boolean;varhWnd: Integer;ResultCode: Integer;beginResult := true;if CurPage = wpReady then beginhWnd := StrToInt(ExpandConstant('{wizardhwnd}'));// don't try to init isxdl if it's not needed because it will error on < ie 3if downloadNeeded then beginisxdl_SetOption('label', 'Downloading YourAppName Components');isxdl_SetOption('description', 'YourAppName needs to install some components. Please wait while Setup is downloading extra files to your computer.');if isxdl_DownloadFiles(hWnd) = 0 then Result := false;end;if (Result = true) and (dotNetNeeded = true) then beginif Exec(ExpandConstant(dotnetRedistPath), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin// handle success if necessary; ResultCode contains the exit codeif not (ResultCode = 0) then beginResult := false;end;end else begin// handle failure if necessary; ResultCode contains the error codeResult := false;end;end;FileCopy(ExpandConstant('{tmp}\Installation.msi'), ExpandConstant('{app}\Installation.msi'), false);FileCopy(ExpandConstant('{tmp}\setup.exe'), ExpandConstant('{app}\setup.exe'), false);end;end;function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;vars: string;beginif memoDependenciesNeeded <> '' then s := s + 'Dependencies to install:' + NewLine + memoDependenciesNeeded + NewLine;s := s + MemoDirInfo + NewLine + NewLine;Result := send;[Run]Filename: msiexec.exe; Parameters: "/i ""{tmp}\Installation.msi "" /qb"[UninstallRun]Filename: msiexec.exe; Parameters: "/x ""{app}\Installation.msi "" /quiet"
--------------------------------------------------
Files]
Source: MyPackage.msi; DestDir: {tmp}
[Run]
Filename: {%COMSPEC}; Parameters: /C msiexec -i {tmp}\MyPacakge.msi; WorkingDir:{tmp}; StatusMsg: “Installing my package”
-------------------------------------------- // 或者
[Run]
Filename: msiexec.exe; Parameters: “-i “”{src}\MyPacakge.msi”" -qn”; WorkingDir: “{src}”; StatusMsg: “Installing my package”