簡述
Inno Setup 是一個免費的 Windows 安裝程序制作軟件。第一次發表是在 1997 年,現在已經更新到Inno Setup 5了。Inno Setup是一個十分簡單實用的打包小工具,可以按照我們自己的意願設置功能,穩定性也十分好。
官方網址:http://www.jrsoftware.org/
安裝教程
一、下載安裝
官方下載地址:http://www.jrsoftware.org/isdl.php
下載后直接安裝即可
二、修改安裝包的管理員權限
Inno Setup打包的程序在安裝時,安裝步驟最后一步若選中運行程序,會跳出一個錯誤提示框。不能執行文件,請求的操作需要提升。這是因為系統運行程序時需要管理員權限,而打包的文件並沒有這個權限就試圖直接運行。解決方法需要給Inno Setup添加管理員權限。
1. 找到Inno Setup的安裝路徑,如E:\Inno Setup 5,在里面找到SetupLdr.e32文件。
2.下載一個eXeScope.exe,直接把SetupLdr.e32文件拖入程序中打開,eXeScope.exe可以百度直接搜索下載,或者在這里可以下載https://download.csdn.net/download/sakuya__/11107284
選擇XPMainifest下1目錄,修改level的值並把相應的ASCII碼修改:
修改完后,記得保存。這樣修改完后,Inno Setup打包的軟件安裝后的圖標上右下就會有一個小盾牌的圖標,表示已經獲得管理員權限。
打包教程
(1)打開Inno setup 5軟件,點擊文件—>新建:
(2)點擊下一步
(3)第一行填程序的名稱,第二行為程序的版本,第三、四行的應用程序發布者和網站可以不填,填寫完后選擇下一步
(4)這里基本不用更改,點擊下一步
(5)這里上面要選擇程序的主執行文件,也就是你編譯生成的exe文件,下面選擇添加文件夾,把所有你的程序運行需要的dll和資源以及配置文件放在一個文件夾里,選擇這個文件夾。然后下一步
(6)這里需要哪些功能,在前邊打上對勾即可,點擊下一步
(7)這里可以選擇許可文件,安裝前的文件(如Readme文件等),安裝后顯示信息等,點擊下一步
(8) 此處選擇安裝語言
(9)在這里選擇編譯后安裝包的輸出文件夾,輸出文件名等,還可以加載自定義的安裝程序圖標,填寫完成后,點擊下一步
(10)在這里選擇是否使用define編譯指令,選擇是也就是在生成的腳本里使用#define宏定義一些常量,方便腳本編寫,不勾選就是不用,看個人。選擇后點擊下一步,完后完成。
(11) 點擊完成后會詢問你是否立即編譯新的腳本,這個腳本是根據剛才我們前面填寫的那些內容自動生成的。可以直接使用編譯,也可以自己重新編寫,下面我會貼上我自己的寫的一個把每行意思注釋上,當做參考
腳本代碼
#define MyAppName "test"
#define MyAppVersion "1.0"
#define MyAppPublisher "sakuya"
#define MyAppExeName "test.exe" [Setup] ; 注: AppId的值為單獨標識該應用程序。 ; 不要為其他安裝程序使用相同的AppId值。 ; (生成新的GUID,點擊 工具|在IDE中生成GUID。) AppId={{241FCDA1-8869-439C-9C7F-BF0061ADE5BC} ;應用程序名稱 AppName={#MyAppName} ;應用程序版本號 AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} ;默認安裝文件夾名 DefaultDirName={pf}\{#MyAppName} DefaultGroupName={#MyAppName} ;輸出的exe的地址 OutputDir=C:\Users\Lenovo\Desktop OutputBaseFilename=test ;exe的圖標的路徑 SetupIconFile=C:\Users\Lenovo\Desktop\heart.ico ;使用壓縮類算法lzma Compression=lzma ;固定壓縮格式 SolidCompression=yes ;不需要管理權限也能安裝 PrivilegesRequired=none [Languages] ;中文語言 Name: "chinesesimp"; MessagesFile: "compiler:Default.isl" [Tasks] ;Tasks: desktopicon 任務:生成快捷方式 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 [Files] ;生成的快捷方式所指的原執行文件 Source: "C:\Users\Lenovo\Desktop\test\test.exe"; DestDir: "{app}"; Flags: ignoreversion ;打包的目錄 Source: "C:\Users\Lenovo\Desktop\test\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; 注意: 不要在任何共享系統文件上使用“Flags: ignoreversion” [Icons] ;生成開始菜單可執行程序map.exe是你目錄下的可執行文件 WorkingDir: {app}” WorkingDir后面加{app} app的意思是隨安裝目錄生成 Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ;生成開始菜單卸載 Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}";WorkingDir:"{app}" ;Tasks: desktopicon 上面任務中的,生成快捷方式 Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent [Code] var ErrorCode: Integer; IsRunning: Integer; //判定程序已經被安裝過而不需要重復安裝,判斷當前安裝路徑下已經有要安裝的exe // 安裝時判斷客戶端是否正在運行
function InitializeSetup(): Boolean; begin Result :=true; //安裝程序繼續
if FileExists(ExpandConstant('{pf}\test\test.exe')) then begin MsgBox('程序已經安裝在你的系統中了!', mbInformation, MB_OK ); Result := false; end; IsRunning:=FindWindowByWindowName('test'); 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('test'); end; end; end; // 卸載時判斷客戶端是否正在運行
function InitializeUninstall(): Boolean; begin Result :=true; //安裝程序繼續
IsRunning:=FindWindowByWindowName('test'); 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('test'); 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); //插入代碼執行卸載后的任務 //ShellExec('open', 'http://www.baidu.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end; end; end;