How to check if a process is running using Delphi?

前端 未结 5 1729
孤独总比滥情好
孤独总比滥情好 2020-12-31 05:19

Similar to this question, but in Delphi:

How do I find out if a process is already running using c#?

I have an updater program, I want it to check the progra

相关标签:
5条回答
  • 2020-12-31 05:32

    If you have control over the application (as is implied from your question), a nice way to do this is to create a named file mapping object early in the process starts. This is similar to the suggestion of creating a mutex from RedLEON.

    // Add this into the application you wish to update
    CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READONLY, 0, 32, 'MAIN-PROGRAM');
    // Note: Mapping object is destroyed when your application exits
    
    // Add this into your updater application       
    var
        hMapping: HWND;
    begin
        hMapping := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READONLY, 0, 32, 'MAIN-PROGRAM');
        if (hMapping <> 0) then
            begin
            if (GetLastError() = ERROR_ALREADY_EXISTS) then
                ShowMessage('Application to update is already running!');
            end;
    

    Check out the MSDN documentation on CreateFileMapping for further details.

    See also the accepted answer to this question which covers Luke's answer and provides additional solutions.

    0 讨论(0)
  • 2020-12-31 05:33

    I' m typing these codes initialization part of main unit.

    initialization
    mHandle := CreateMutex(nil, True, 'myApp.ts');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageDlg('Program already running!', mtError, [mbOK], 0);
      Halt;
    end;
    
    0 讨论(0)
  • 2020-12-31 05:42
    uses TlHelp32, PsAPI;
    
    function ProcessExists(anExeFileName: string): Boolean;
    var
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
      fullPath: string;
      myHandle: THandle;
      myPID: DWORD;
    begin
      // wsyma 2016-04-20 Erkennung, ob ein Prozess in einem bestimmten Pfad schon gestartet wurde.
      // Detection wether a process in a certain path is allready started.
      // http://stackoverflow.com/questions/876224/how-to-check-if-a-process-is-running-using-delphi
      // http://swissdelphicenter.ch/en/showcode.php?id=2010
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
      Result := False;
      while Integer(ContinueLoop) <> 0 do
      begin
        if UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExtractFileName(anExeFileName)) then
        begin
          myPID := FProcessEntry32.th32ProcessID;
          myHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, myPID);
          if myHandle <> 0 then
          try
            SetLength(fullPath, MAX_PATH);
            if GetModuleFileNameEx(myHandle, 0, PChar(fullPath), MAX_PATH) > 0 then
            begin
              SetLength(fullPath, StrLen(PChar(fullPath)));
              if UpperCase(fullPath) = UpperCase(anExeFileName) then
                Result := True;
            end else
              fullPath := '';
          finally
            CloseHandle(myHandle);
          end;
          if Result then
            Break;
        end;
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
      CloseHandle(FSnapshotHandle);
    end;
    
    0 讨论(0)
  • 2020-12-31 05:43

    from: http://www.delphitricks.com/source-code/windows/check_if_a_process_is_running.html

    uses TlHelp32; 
    
        function processExists(exeFileName: string): Boolean; 
    var 
      ContinueLoop: BOOL; 
      FSnapshotHandle: THandle; 
      FProcessEntry32: TProcessEntry32; 
    begin 
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
      Result := False; 
      while Integer(ContinueLoop) <> 0 do 
      begin 
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
          UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = 
          UpperCase(ExeFileName))) then 
        begin 
          Result := True; 
        end; 
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
      end; 
      CloseHandle(FSnapshotHandle); 
    end; 
    
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      if processExists('notepad.exe') then 
        ShowMessage('process is running') 
      else 
        ShowMessage('process not running'); 
    end;
    
    0 讨论(0)
  • 2020-12-31 05:52

    If you're writing a bit of auto-updating code, you could also consider making a connection of some sort to your application and telling it to shut itself down.

    This could e.g. involve posting a message to the main window of your application telling it to shut itself down. Or opening an IPC pipe etc.

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