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;

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