Inno安装Pascal脚本来search正在运行的进程

我目前正试图在卸载时进行validation。 在Inno Setup中的Pascal脚本函数中,我想要search特定的进程,如果可能的话使用通配符。 然后,遍历所有查找结果,获取图像名称和图像path名称,以检查即将卸载的程序是否与正在运行的程序相同。

有没有办法做到这一点?

这是WMI及其WQL语言的一个示例性任务。 通过WMI获取正在运行的进程列表比Windows API 更可靠 。 以下示例显示如何使用LIKE运算符查询Win32_Process类:

 [Setup] AppName=My Program AppVersion=1.5 DefaultDirName={pf}\My Program DefaultGroupName=My Program [Code] type TProcessEntry = record PID: DWORD; Name: string; Description: string; ExecutablePath: string; end; TProcessEntryList = array of TProcessEntry; function GetProcessList(const Filter: string; out List: TProcessEntryList): Integer; var I: Integer; WQLQuery: string; WbemLocator: Variant; WbemServices: Variant; WbemObject: Variant; WbemObjectSet: Variant; begin Result := 0; WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); WbemServices := WbemLocator.Connectserver('localhost', 'root\CIMV2'); WQLQuery := 'SELECT ' + 'ProcessId, ' + 'Name, ' + 'Description, ' + 'ExecutablePath ' + 'FROM Win32_Process ' + 'WHERE ' + 'Name LIKE "%'+ Filter +'%"'; WbemObjectSet := WbemServices.ExecQuery(WQLQuery); if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then begin Result := WbemObjectSet.Count; SetArrayLength(List, WbemObjectSet.Count); for I := 0 to WbemObjectSet.Count - 1 do begin WbemObject := WbemObjectSet.ItemIndex(I); if not VarIsNull(WbemObject) then begin List[I].PID := WbemObject.ProcessId; List[I].Name := WbemObject.Name; List[I].Description := WbemObject.Description; List[I].ExecutablePath := WbemObject.ExecutablePath; end; end; end; end; procedure InitializeWizard; var S: string; I: Integer; Filter: string; ProcessList: TProcessEntryList; begin MsgBox('Now we try to list processes containing "sv" in their names...', mbInformation, MB_OK); Filter := 'sv'; if GetProcessList(Filter, ProcessList) > 0 then for I := 0 to High(ProcessList) do begin S := Format( 'PID: %d' + #13#10 + 'Name: %s' + #13#10 + 'Description: %s' + #13#10 + 'ExecutablePath: %s', [ ProcessList[I].PID, ProcessList[I].Name, ProcessList[I].Description, ProcessList[I].ExecutablePath]); MsgBox(S, mbInformation, MB_OK); end; end;