@Inno Setup卸载分享
对于ISS脚本使用感悟分享
最近有个任务用到了ISS的打包脚本,其中一个需求就是在卸载exe时能够在卸载过程中运行一个EXE或者调用一个DLL接口去完成某项任务的功能。经过调研、学习简单分享一下。
1、EXE调用:
以该方式实现功能需要考虑两点:
1、在exe进行相关功能实现时,放在什么地方好。
2、exe在执行完相关任务后会不会造成进程残留问题,从而使得整体卸载任务失败。
经过调研发现可以将功能实现的逻辑封装好接口,在exe的类构造里实现,同时该exe如果没有其他的特殊处理的话,其将在任务结束后进程将释放。
exe实现逻辑简单在这里不在叙述,重点讲一下iss脚本中如何调用执行exe。
Inno Setup中的ShellExec
官方给出的接口定义为:
function ShellExec(
const Verb,
Filename,
Params,
WorkingDir: String;
const ShowCmd: Integer;
const Wait: TExecWait;
var ErrorCode: Integer): Boolean;
参数Verb 表示执行的动作,例如open,注意是字符串"open"。
参数Filename表示要执行的文件名称,可以是exe或者其他。
参数Param表示一个要执行的命令,可以是exe或者一个带路径和属性的exe
参数WorkingDir表示一个工作路径。
后续三个参数分别是是否展示命令、等待和一个错误码。
熟悉完官方接口以后根据我的使用特性我的使用方式将是:打开一个进程完成我的某些功能具体实现如下:
ShellExec('open','我的exe','','',SW_HIDE,ewWaitUntilTerminated,ErrorCode);
代码具体的含义就是再卸载的时候隐藏的运行一个东西去完成某项任务。
Inno Setup 里面调用DLL接口
在Inno Setup里面调用DLL的某个接口首先需要DLL向外界暴露一个可用的接口。
DLL接口封装:
extern “C” X_API int STDCALL APP();
APP是封装的接口,()里面可以选择是否带有参数。
Inno Setup里面接口导出有两种方式:有返回值和无返回值两种
1、function ExitProcess(exitCode: integer): Integer; external 'ExitProcess@kernel32.dll stdcall';
2、procedure BtnSetChecked(h:HWND; Value:boolean); external 'BtnSetChecked@{tmp}\botva2.dll stdcall delayload';
funtion 表示有返回值,ExitProcess表示函数名称 ()里表示参数,:后面是函数返回类型,exeternal表示接口导出的源,即DLL里的函数名称@路径+DLL名称和导出的类型为stdcall,还可以表明属性比如什么时候调用,例如delayload延时加载等。