如果进程在Windows 2008 R2 64bit上运行,如何查看Inno Setup?

Chr*_*ach 13 windows inno-setup 32bit-64bit pascalscript

我看过以下帖子.我的代码看起来完全相同,但不起作用:
Inno Setup检查运行过程

我从http://www.vincenzo.net/isxkb/index.php?title=PSVince复制了这个例子

但是这个例子也不起作用,即使我改变了这样的代码:

[Code]
function IsModuleLoaded(modulename: AnsiString):  Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';
Run Code Online (Sandbox Code Playgroud)

代码总是返回false(程序没有运行,即使它正在运行).在Windows 2008 R2和Windows 7上测试过.

事实上我想检查,如果它tomcat5.exe正在运行.所以我想我不能用AppMutex.

我也看过https://code.google.com/p/psvince/source/detail?r=5
但我找不到有关该DLL兼容性的任何事实.

完整代码:

[Files]
Source: psvince.dll; Flags: dontcopy

[Code]
function IsModuleLoaded(modulename: AnsiString ):  Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';

function InitializeSetup(): Boolean;
begin
  if(IsModuleLoaded( 'notepad.exe' )) then
    begin
      MsgBox('Running', mbInformation, MB_OK);
      Result := false;
    end
  else
    begin
      MsgBox('Not running', mbInformation, MB_OK);
      Result := true;
    end
end;
Run Code Online (Sandbox Code Playgroud)

RRU*_*RUZ 45

您可以使用WMI和Win32_Process.

尝试将此功能添加到Inno Setup脚本中.

function IsAppRunning(const FileName : string): Boolean;
var
    FSWbemLocator: Variant;
    FWMIService   : Variant;
    FWbemObjectSet: Variant;
begin
    Result := false;
    FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
    FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
    FWbemObjectSet :=
      FWMIService.ExecQuery(
        Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
    Result := (FWbemObjectSet.Count > 0);
    FWbemObjectSet := Unassigned;
    FWMIService := Unassigned;
    FSWbemLocator := Unassigned;
end;
Run Code Online (Sandbox Code Playgroud)


小智 7

我没有足够的代表点来为RRUZ的优秀答案添加评论,所以我只想在这里添加.确保捕获异常,否则安装程序将无法访问无法访问该服务的用户.

try
      FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
      FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
      FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
      Result := (FWbemObjectSet.Count > 0);
except
end;
Run Code Online (Sandbox Code Playgroud)


Lex*_* Li 1

不幸的是,根据我的观察,psvince.dll 无法查询 64 位正在运行的进程,并且由于我不是它的开发人员,我不知道如何修复它以在 Windows x64 上工作。

我的解决方法是使用自制的命令行实用程序 processviewer.exe,

http://github.com/lextm/processviewer

这已在 Windows 7 x64 上的Touch Mouse Mate中进行了测试

http://www.lextm.com/2012/03/new-inno-setup-installer-script-samples-version-compare-running-processes/