Inno Setup 杀死一个正在运行的进程

Bru*_*zic 3 installation inno-setup kill

我已经实现了一种方法来查找进程(“iexplore.exe”)是否正在运行,我现在需要找到一种方法来从 Inno Setup 中关闭它(终止进程)。

strProg := 'iexplore.exe';
winHwnd := FindWindowByWindowName(strProg);
MsgBox('winHwnd: ' + inttostr(winHwnd),  mbInformation, MB_OK );
if winHwnd <> 0 then
  retVal:=postmessage(winHwnd,WM_CLOSE,0,0);
Run Code Online (Sandbox Code Playgroud)

上面示例中的消息框将始终返回 0,因此永远不会获得句柄。(WM_CLOSE示例中的常量已正确初始化)我需要另一种方法来做到这一点,希望这种方法不涉及编写执行此操作的 C++ DLL(我不精通 C++,我可能能够在 C# 中编写一个 DLL ,但我不知道 Inno Setup 是否会与之互操作)。

这个 C# DLL 将获取进程列表,遍历进程的名称,找到匹配项(==“iexplorer”),然后终止具有该名称的进程......但是我仍然希望找到一个更简单的解决方案,以便我不必与 Pascal 脚本互操作。

提前致谢!

ari*_*wez 5

使用 的版本Win32_Process,您可以使用 ie 'notepad.exe' 调用该过程:

const wbemFlagForwardOnly = $00000020;

procedure CloseApp(AppName: String);
var
  WbemLocator : Variant;
  WMIService   : Variant;
  WbemObjectSet: Variant;
  WbemObject   : Variant;
begin;
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WMIService := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"');
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    WbemObject := WbemObjectSet.ItemIndex(0);
    if not VarIsNull(WbemObject) then
    begin
      WbemObject.Terminate();
      WbemObject := Unassigned;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)