1. 程式人生 > >NSIS安裝過程中判斷程式是否執行中,FindProcDLL和KillProcDLL

NSIS安裝過程中判斷程式是否執行中,FindProcDLL和KillProcDLL

FindProcDLL::FindProc {process_name} 返回值: 0 - 未找到 1 - 找到

KillProcDLL::KillProc {process_name} 0 - 殺程序成功 603 - 未找到此程序(也有可能是無法訪問程序,如因使用者許可權問題等) 其它 - 各種錯誤

所以,在殺程序時,如果返回603,最後再findproc一下,確認是否程序不存在。 一般示例程式碼:

!macro DefFunc_ForceKillProcess un
Function ${un}ForceKillProcess
    Pop $0  ; module name
    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_ICONSTOP "無法終止 $0 ($1),請手動終止此程式後重試"
Quit
check_no_more:
FindProcDLL::FindProc "$1"
Pop $R0
IntCmp $R0 1 fail_to_kill  ; 如果FindProc結果為1,表示找到了程式,說明殺程序失敗,否則繼續
no_more:
FunctionEnd
!macroend