Inno Setup 打包创建自定义后缀名的文件

最近公司需要实现这样一个需求:用户双击即可打开我们公司自定义的文件,如abc.yoya,我使用了Inno Setup编译器(版本5.5.5)。由于第一次使用Inno Setup 编译器,使用过程中遇到了不少问题,但经过几天的短暂接触使用和测试,现在已经基本实现需求。现在将我的安装脚本(完整)和经验跟大家分享学习。脚本功能包括:安装协议,开始菜单快捷方式,桌面快捷方式,自定义文件类型,更改卸载图标和卸载名称,安装前的版本检测,修改注册表等。

一. 定义全局默认值和配置初始化信息

配置脚本如下:

; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
; 定义基本参数,如应用名称,应用版本号,发布者名称,发布者主页,应用唯一ID值(该值用于在计算机注册表中作为该应用的唯一标识)
#define MyAppName "优芽互动电影播放器"
#define MyAppVersion "1.0"
#define MyAppPublisher "厦门优芽网络科技有限公司"
#define MyAppURL "http://www.yoya.com/"
#define APPID "YoyaPlay"

[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。也可以自定义,如YoyaPlay)
AppId={#APPID}
; 程序名
AppName={#MyAppName}
;程序版本号
AppVersion={#MyAppVersion}
AppVerName={#MyAppName}{#MyAppVersion}
;发布者
AppPublisher={#MyAppPublisher}
;相关连接
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
;默认安装目录
DefaultDirName={pf}\YoyaPlay
;默认开始菜单名
DefaultGroupName=YoyaPlay                  
;安装协议
LicenseFile=F:\9辅助软件\inno setup\Inno Setup 5\Examples\Readme.txt
;输出文件夹与文件名
OutputDir=C:\Users\netinnet\Desktop
OutputBaseFilename=setup
;安装图标
SetupIconFile=C:\Users\netinnet\Desktop\nw_32bit\yoya.ico
;卸载图标
Uninstallable=true
UninstallDisplayIcon={app}\yoya.ico
;压缩相关
Compression=lzma
SolidCompression=yes
;安装完成后要求重启,因为要刷新注册表,这样自定义的文件就不会被杀毒软件误认为是无效快捷方式
AlwaysRestart=yes
;备注版本信息
VersionInfoCompany=http://www.yoya.com/ 
VersionInfoDescription=优芽互动电影播放器  
VersionInfoVersion=1.0
VersionInfoCopyright=Copyright (C)2014

二. 定义使用语言、文件位置和提示消息

配置脚本如下:

;使用语言
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

[Files]
;注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
;我的应用程序位置,包括exe应用程序,ico图标,dll动态链接库等
Source: "C:\Users\netinnet\Desktop\nw_32bit\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;卸载图标位置
Source: "C:\Users\netinnet\Desktop\nw_32bit\uninstall.ico"; Flags: solidbreak dontcopy
;卸载插件位置
Source: "C:\Users\netinnet\Desktop\nw_32bit\UpdateIcon.dll"; Flags: solidbreak dontcopy 

[Messages]
BeveledLabel=优芽互动电影播放器  
;卸载对话框说明  
ConfirmUninstall=您真的想要从电脑中卸载优芽互动电影播放器吗?%n%n按 [是] 则完全删除 %1 以及它的所有组件;%n按 [否]则让软件继续留在您的电脑上. 

三.  自定义注册表,开始菜单和桌面快捷方式

我的应用无需开始菜单和桌面快捷方式,故此处注释掉该部分代码:

;自定义注册表,用于在用户系统中创建,修改或删除注册表健值
[Registry]
Root: HKLM; Subkey: Software\YoyaPlay; ValueType: string; ValueName: Installed version; ValueData: '1.0'; Flags: uninsdeletekey
Root: HKCR; Subkey: "YoyaPlay"; ValueType: String; ValueData: "优芽网媒体文件";Flags: uninsdeletekey
Root: HKCR; Subkey: "YoyaPlay\DefaultIcon"; ValueType: String; ValueData: "{app}\yoyafile.ico";Flags: uninsdeletekey
Root: HKCR; Subkey: "YoyaPlay\shell\open\command"; ValueType: String; ValueData: "{app}\YoyaPlay.exe %1";Flags: uninsdeletekey
Root: HKCR; Subkey: ".yoya"; ValueType: String; ValueData: "YoyaPlay";Flags: uninsdeletekey

;任务列表   
;[Tasks]
;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked  
;Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked  

;开始菜单,桌面快捷方式  
;[Icons]  
;Name: "{group}\YoyaPlay"; Filename: "{app}\YoyaPlay.exe"  
;Name: "{group}\{cm:ProgramOnTheWeb,YoyaPlay}"; Filename: "http://www.yoya.com"  
;Name: "{group}\{cm:UninstallProgram,YoyaPlay}"; Filename: "{app}\YoyaUninstall.exe"  
;Name: "{commondesktop}\YoyaPlay"; Filename: "{app}\YoyaPlay.exe"; Tasks: desktopicon  
;Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\YoyaPlay"; Filename: "{app}\YoyaPlay.exe"; Tasks: quicklaunchicon      

四. 执行代码

安装过程逻辑脚本:

;在执行脚本  
[code]
function GetInstalledVersion(): String;
var InstalledVersion: String;
begin
  InstalledVersion :='';
  RegQueryStringValue(HKLM, 'Software\YoyaPlay', 'Installed version', InstalledVersion);
  Result := InstalledVersion;
end;

function InitializeSetup(): Boolean;
var PrevVer: String;
begin
  PrevVer := GetInstalledVersion();
  result := true;
  if length(PrevVer) > 0 then 
  begin
    //如果发现程序已经安装过了
    MsgBox ('本程序的 ' + PrevVer + ' 版本已经安装,请卸载后再安装本程序. 安装程序将关闭.', mbError, MB_OK);
    result := false;
  end;
end;
//插件函数用法
//参数: 句柄(插件错误对话框的父句柄), exe文件完整路径名称, (exe文件中要替换的)图标资源名称, 图标文件的完整路径名称, (exe中要替换的图标资源所在)语系
//返回值: 成功 = True, 失败 = False
//安装初始化
function UpdateIcon(const hWnd: Integer; const exeFileName, exeIcon, IcoFileName: String; wlangID: DWORD): Boolean;
external 'UpdateIcon@files:UpdateIcon.dll stdcall';
//替换卸载程序的图标
function UpdateUninstIcon(const IcoFileName: String): Boolean;
begin 
  //要替换图标的exe文件路径名称留空,则插件会自动替换掉Inno卸载程序的图标!其它参数类似!
  Result:= UpdateIcon(MainForm.Handle, '', '', IcoFileName, 0); //替换卸载图标
end;
procedure CurStepChanged(CurStep: TSetupStep);
var uninspath, uninsname, NewUninsName, MyAppName,sIcon: String;

begin
  //注意: 替换卸载程序的图标,必须是在卸载程序生成之前!
  //建议安装图标与卸载图标的格式与大小一致,否则可能会导致卸载程序出错!
  if CurStep=ssInstall then
    begin
    sIcon:= ExpandConstant('{tmp}\uninstall.ico'); //定义卸载图标
    //ExtractTemporaryFile('UpdateIcon.dll');//该动态链接库可网上查找
    ExtractTemporaryFile(ExtractFileName(sIcon)); //释放卸载图标
    //要替换图标的exe文件路径名称留空,则插件会自动替换掉Inno卸载程序的图标!
    UpdateUninstIcon(sIcon) //替换卸载图标
    end;
  if CurStep=ssDone then
    begin
    // 指定新的卸载文件名(不包含扩展名),请相应修改!  
    NewUninsName := 'YoyaUninstall';  
    // 应用程序名称,与 [SEUTP] 段的 AppName 必须一致,请相应修改!  
    MyAppName := '优芽互动电影播放器';  
    // 以下重命名卸载文件  
    uninspath:= ExtractFilePath(ExpandConstant('{uninstallexe}'));  
    uninsname:= Copy(ExtractFileName(ExpandConstant('{uninstallexe}')),1,8);  
    RenameFile(uninspath + uninsname + '.exe', uninspath + NewUninsName + '.exe');  
    RenameFile(uninspath + uninsname + '.dat', uninspath + NewUninsName + '.dat'); 
    end; 
    // 以下修改相应的注册表内容
    if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#APPID}_is1') then
    begin
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#APPID}_is1', 'UninstallString', '"' + uninspath + NewUninsName + '.exe"');
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#APPID}_is1', 'QuietUninstallString', '"' + uninspath + NewUninsName + '.exe" /SILENT');
    end;   
end;

如果想要在程序安装过程中或之后执行某批处理或打开某应用,可使用一下语句:

[Run]
Filename: "{app}\Reflash.bat"; Description: "正在刷新注册表"; Flags: runhidden;

至此大功告成,另外,所使用的ICO图标尺寸建议用128*128 。

应用图标:

安装过程:

Inno Setup 打包创建自定义后缀名的文件_第1张图片Inno Setup 打包创建自定义后缀名的文件_第2张图片Inno Setup 打包创建自定义后缀名的文件_第3张图片Inno Setup 打包创建自定义后缀名的文件_第4张图片Inno Setup 打包创建自定义后缀名的文件_第5张图片

卸载相关:

Inno Setup 打包创建自定义后缀名的文件_第6张图片

 

 

你可能感兴趣的:(Inno Setup 打包创建自定义后缀名的文件)