NSIS脚本对于传参的⽀持不好,当传⼊参数时需要⼿动push参数(类似汇编)。
Function ForceKillProcessImp
Pop $1 ; exe name
try_kill_one:
KillProcDLL::KillProc "$1"
Pop $R0
IntCmp $R0 0 try_kill_one ; 返回0表⽰杀进程成功,则应继续杀此进程名的其它进程
IntCmp $R0 603 check_no_more ; 返回603表⽰没到此进程,有两种情况:a) 确实没有此进程 b) 因权限等原因⽆法访问此进程,如果第2种,应认为杀进程失fail_to_kill: ; KillProc返回值⾮0⾮603,或返回603但实际上此进程仍存在,均表⽰杀进程失败
MessageBox MB_ICONQUESTION|MB_YESNO "⽆法终⽌$1,是否重试?" IDYES try_kill_one IDNO fail_quit
文献研究法fail_quit:
Quit
check_no_more:
FindProcDLL::FindProc "$1"
Pop $R0
IntCmp $R0 1 fail_to_kill ; 如果FindProc结果为1,表⽰到了程序,说明杀进程失败,否则继续
FunctionEnd
这个函数被设计为传⼊⼀个参数,将参数指定的进程杀死。
需要这样调⽤:
$0 = "123456"
聚四氟乙烯涂层
Push $0小提琴独奏夏夜
Call ForceKillProcessImp
每⼀个进程都需要调⽤⼀次,当某些产品的相关进程很多,或者时要在多个地⽅判断时就会⾮常不⽅便。可以使⽤宏将改进以上代码使得更
简洁⽅便,如下:
!macro ForceKillProcess EXEName
杜香油push ${EXEName}
珍妮特 李Call ForceKillProcessImp
!macroend
这样,在需要杀死进程的地⽅做如下调⽤即可:
!insertmacro ForceKillProcess ""
!insertmacro ForceKillProcess ""
黄晨霄
!insertmacro ForceKillProcess ""
上⾯的!insertmacro这个指令告诉编译器将ForceKillProcess这个宏代表的指令插⼊到NSIS的源码中。
相当于:
push “”
Call ForceKillProcessImp
push “”
Call ForceKillProcessImp
push “”
Call ForceKillProcessImp
对⽐以下可见使⽤宏的⽅式明显更加简单清晰。