Inno setup打包工具安裝和卸載前檢查程序是否在運行

方案1:窗口名稱判斷FindWindowByWindowName

原理:通過檢查窗口名稱來判斷程序是否運行

說明:如果文件夾名稱也叫這個,也會認爲是程序,造成錯誤判斷。

 

;RUN msg

#define RUNNINGMSG_CH " 正在運行,請先退出!"

#define RUNNINGMSG_EN " is running,please quit first!"

 

【code】

// 獲取警告信息

function GetRunningNotice(Param: String):String;

var

lan:String;

appName:String;

 

begin

  lan := ActiveLanguage();

  appName := '{#appname}';

  if (lan = 'English') then

    Result := appName + '{#RUNNINGMSG_EN}'

  else

    Result := appName + '{#RUNNINGMSG_CH}';

end;

 

// 安裝時判斷客戶端是否正在運行

function InitializeSetup(): Boolean;

var

  IsRunning: Integer;

  name:String;

  notice:String;

 

begin

  Result :=true; //安裝程序繼續

  name := '程序標題';

  IsRunning:=FindWindowByWindowName(name);

  if IsRunning <> 0 then

  begin

    notice := GetRunningNotice('');

    Msgbox(notice, mbConfirmation, MB_OK);

    Result :=false; //安裝程序退出

  end;

end;

 

 

// 卸載時判斷客戶端是否正在運行

function InitializeUninstall(): Boolean;

var

  IsRunning: Integer;

  name:String;

  notice:String;

 

begin

  Result :=true; //安裝程序繼續

  name := '程序標題';

  IsRunning:=FindWindowByWindowName(name);

  if IsRunning <> 0 then

  begin

    notice := GetRunningNotice('');

    Msgbox(notice, mbConfirmation, MB_OK);

    Result :=false; //安裝程序退出

  end;

 

方案2:通過庫psvince.dllIsModuleLoaded接口來判斷程序進程(名稱)是否在運行

說明:只能判斷,不能結束進程,需要將psvince.dll拷貝到inno setup安裝目錄下,還需要拷貝到要打包程序的同級目錄下

 

[Files]

Source: compiler:psvince.dll; Flags: dontcopy noencryption

 

// 安裝時判斷客戶端是否正在運行

function IsModuleLoaded(modulename: String ): Boolean;

external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';

 

function InitializeSetup(): Boolean;

var

  IsRunning: boolean;

  name:String;

  notice:String;

 

begin

  Result :=true; //安裝程序繼續

  name := '程序.exe';

    IsRunning:= IsModuleLoaded(name);

    if IsRunning then

  begin

    notice := GetRunningNotice('');

    Msgbox(notice, mbConfirmation, MB_OK);

    Result :=false; //安裝程序退出

  end;

end;

 

 

// 安裝時判斷客戶端是否正在運行

function IsModuleLoadedU(modulename: String ): Boolean;

external 'IsModuleLoaded@{app}/psvince.dll stdcall uninstallonly';

 

function InitializeSetup(): Boolean;

var

  IsRunning: boolean;

  name:String;

  notice:String;

 

begin

  Result :=true; //安裝程序繼續

  name := ''程序.exe';

    IsRunning:= IsModuleLoaded(name);

    if IsRunning then

  begin

    notice := GetRunningNotice('');

    Msgbox(notice, mbConfirmation, MB_OK);

    Result :=false; //安裝程序退出

  end;

UnloadDll(ExpandConstant('{app}/psvince.dll'));// 必須要釋放,否則卸載不乾淨

end;

 

方案3:通過庫IsTask.dll的RunTask接口來判斷程序進程(名稱)是否在運行,使用接口KillTask結束進程

說明:不但能判斷,還能結束進程,需要將ISTask.dll拷貝到inno setup安裝目錄下,還需要拷貝到要打包程序的同級目錄下

 

;RUN msg

#define RUNNINGMSG_CH " 正在運行,點擊按鈕退出程序繼續安裝,點擊按鈕停止安裝!"

#define RUNNINGMSG_EN " is running,click Yes to continue install and click No to stop install!"

 

[Files]

Source: compiler:ISTask.dll; Flags: dontcopy noencryption

 

// 安裝時判斷客戶端是否正在運行

function RunTask(FileName: string; bFullpath: Boolean): Boolean;

external 'RunTask@files:ISTask.dll stdcall delayload setuponly';

function KillTask(ExeFileName: string): Integer;

external 'KillTask@files:ISTask.dll stdcall delayload setuponly';

 

function InitializeSetup(): Boolean;

var

  name:String;

  notice:String;

begin

 Result:= true;

 name := ''程序.exe';

 if RunTask(name, false) then

  begin

    notice := GetRunningNotice('');

    if MsgBox(notice, mbConfirmation, MB_YESNO) = IDYES then

      begin

      KillTask(name);

      end

    else

      Result:= false;

  end

end;

 

// 卸載時判斷客戶端是否正在運行

function RunTaskU(FileName: string; bFullpath: Boolean): Boolean;

external 'RunTask@{app}/ISTask.dll stdcall delayload uninstallonly';

function KillTaskU(ExeFileName: string): Integer;

external 'KillTask@{app}/ISTask.dll stdcall delayload uninstallonly';

 

function InitializeUninstall(): Boolean;

var

  name:String;

  notice:String;

begin

 Result:= true;

 name := ''程序.exe';

 if RunTaskU(name, false) then

  begin

    notice := GetRunningNotice('');

    if MsgBox(notice, mbConfirmation, MB_YESNO) = IDYES then

      begin

      KillTaskU(name);

      end

    else

      Result:= false;

  end

  UnloadDll(ExpandConstant('{app}/ISTask.dll'));// 必須要釋放,否則卸載不乾淨

end;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章