Inno Setup Pascal Script to search for running process

后端 未结 2 1013
忘了有多久
忘了有多久 2021-01-06 07:52

I am currently trying to do a validation at the uninstall moment. In a Pascal script function, in Inno Setup, I want to search for a specific processes, with a wild card if

相关标签:
2条回答
  • 2021-01-06 08:05

    This is an exemplary task for WMI and its WQL language. Getting list of running processes through WMI is even more reliable than Windows API. The below example shows how to query the Win32_Process class with the LIKE operator:

    [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;
    
    0 讨论(0)
  • 2021-01-06 08:19

    If not work.Please change as follows.

    (old) for I := 0 to High(ProcessList) do

    (new) for I := 0 to (GetArrayLength(ProcessList) - 1) do

    0 讨论(0)
提交回复
热议问题