1. 程式人生 > >Inno Setup安裝時判斷並關閉已經執行的應用exe

Inno Setup安裝時判斷並關閉已經執行的應用exe

   就很簡單的一個功能,Inno setup製作的安裝包,在安裝時候,判斷是否之前有本程式的實力在執行,執行的話終止他,貌似很簡單,折騰了我1小時。
  網上找的好多方案,不理想不理想!我就給大家列舉下這些我認為不理想的原因!
  網上方案1: 在Code段用FindWindowByWindowName、FindWindowByClassName……對不起我的客戶端的標題是會變的啊!我的客戶端主視窗是對話方塊啊,視窗類名都一樣(#32770)啊!
  網上方案2: 用個叫IsTask.dll的外部擴充套件,Inno setup沒,自己網上下,說白了就是個用c++寫的一個dll,自己也能寫,回頭用Code pascal語言呼叫……,RunTask、KillTask用的這兩個函式……,蛋疼的事情發生了,本來秒開的安裝包,要卡個5秒以上在開啟……懷疑是IsTask.dll破吧,自己寫個,c++中char對應pascal中PAnsiChar,函式匯出呼叫方案方法注意stdcall,弄好,還是通過程序名載入dll……結果……卡……5秒以上……原來是inno setup自己low……升級inno setup到最新5.5.9,一樣……
  網上方案3: 找啊找老半天,發現SETUP段裡可以家個APPMUTEX,不錯,我的exe裡為了不能多開也弄了個非匿名的mutex,馬上家上一句話,點開安裝……我了個去,結果只是提示你有你的exe在執行,自己去關閉吧……啥體驗啊……
  自己的方案,很簡單通過checkmutex判斷是否在執行,是的話通過ShellExec 開啟cmd用taskkill殺死程序……完美解決,也不會載入dll卡的5秒,體驗棒棒噠。
[Code]
var ErrorCode: Integer;
function InitializeSetup(): Boolean;
begin
if CheckForMutexes('CZY_CLIENT_BY_WX') then
       begin
            if MsgBox('檢測到你的超自由客戶端正在執行中!'#13'點選 "是" 關閉超自由客戶端繼續安裝;'#13'點選 "否" 退出安裝程式!', mbConfirmation, MB_YESNO) = IDYES then
               begin
               ShellExec('open', ExpandConstant('{cmd}'), '/c taskkill /f /t /im CZYClient.exe', '', SW_HIDE, ewNoWait, ErrorCode);
               Result:= true;
               end
            else
               Result:= false;
       end
   else
Result:=true;
end;