杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3079|回复: 0

Inno Setup 使用 psvince.dll或istask.dll插件判断进程

[复制链接]
发表于 2017-1-9 20:15:26 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. [Files]
  2. Source: "embedded\psvince.dll"; Flags: dontcopy noencryption
  3. Source: "embedded\psvince.dll"; DestDir: "{app}";
  4. Source: "embedded\psvince.dll"; DestDir: "{app}\kl 8.5\XX";  

  5. [code]
  6. function IsModuleLoaded(modulename: AnsiString ):  Boolean;
  7. external 'IsModuleLoaded@files:psvince.dll stdcall';

  8. function InitializeSetup():boolean;
  9. var
  10.    IsAppRunning: boolean;
  11. begin
  12.     Result := true;
  13. // 第二步,安装时判断客户端是否正在运行
  14.    begin
  15.     Result:= true;//安装程序继续
  16.     IsAppRunning:= IsModuleLoaded('XXX.exe');
  17.     while IsAppRunning do
  18.        begin
  19.         if MsgBox('安装程序检测到XXX正在运行!' #13#13 '您必须先关闭它然后单击“确定”继续安装,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  20.          begin
  21.          IsAppRunning:= IsModuleLoaded('xxx.exe')
  22.          Result:= true;
  23.          end else begin
  24.          IsAppRunning:= false;
  25.          Result:= false;//安装程序退出
  26.          Exit;
  27.          end;
  28.        end;
  29.      end;
  30. end;

  31. // 卸载时判断xxx是否正在运行
  32. function IsModuleLoadedU(modulename: String ): Boolean;
  33. external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly';

  34. function InitializeUninstall(): Boolean;
  35. var
  36.   IsAppRunning: boolean;
  37. begin
  38.   Result :=true;  //卸载程序继续
  39.   IsAppRunning:= IsModuleLoadedU('xxxx.exe');
  40.   while IsAppRunning do
  41.   begin
  42.     if Msgbox('安装程序检测到xxx正在运行。'  #13#13 '您必须先关闭它然后单击“确定”继续卸载,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  43.     begin
  44.       IsAppRunning:= IsModuleLoadedU('xxxx.exe');
  45.       Result :=true; //卸载程序继续
  46.     end else begin
  47.       Result :=false; //卸载程序退出
  48.       Exit;
  49.     end;
  50.   end;
  51.   UnloadDLL(ExpandConstant('{app}\psvince.dll'));
  52. end;
复制代码


经过反复测试,发现psvince.dll插件确实有问题,但是也不是网上说的64位系统里检测不到的问题,
而是检测不到64位进程,跟系统无关。现在,下面的代码可以解决问题(代码来自网上),就不需要任何插件了:

  1. // PSVince控件无法检测到64位exe程序的进程,使用下面的函数可以解决。
  2. function IsAppRunning(const FileName: string): Boolean;
  3. var
  4.   FWMIService: Variant;
  5.   FSWbemLocator: Variant;
  6.   FWbemObjectSet: Variant;
  7. begin
  8.   Result := false;
  9.   FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  10.   FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  11.   FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
  12.   Result := (FWbemObjectSet.Count > 0);
  13.   FWbemObjectSet := Unassigned;
  14.   FWMIService := Unassigned;
  15.   FSWbemLocator := Unassigned;
  16. end;

  17. function InitializeSetup():boolean;
  18. var
  19.    IsRunning: boolean;
  20. // 第二步,安装时判断客户端是否正在运行,注意:使用IsAppRunning函数(已在前面定义),
  21.     //可以在32和64位系统下检测32和64位进程,但还是不能识别进程的版本,如果有多版本的话。
  22.     begin
  23.       Result:= true;//安装程序继续
  24.       IsRunning:= IsAppRunning('ugraf.exe');
  25.       while IsRunning do
  26.          begin
  27.            if MsgBox('安装程序检测到 UG软件 正在运行!' #13#13 '您必须先关闭所有正在运行的UG软件,然后单击“确定”继续安装,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  28.              begin
  29.              IsRunning:= IsAppRunning('ugraf.exe');
  30.              Result:= true;
  31.              end else begin
  32.              IsRunning:= false;
  33.              Result:= false;//安装程序退出
  34.              Exit;
  35.              end;
  36.          end;
  37.      end;
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-19 19:02 , Processed in 0.097657 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表