Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nur starten wenn anderes Programm NICHT ausgeführt wird. (https://www.delphipraxis.net/10182-nur-starten-wenn-anderes-programm-nicht-ausgefuehrt-wird.html)

Rapthor 13. Okt 2003 11:40


Nur starten wenn anderes Programm NICHT ausgeführt wird.
 
Die Frage kam schonmal von mir, allerdings wusste ich da nicht, wie ich es quelltextmäßig realisieren sollte, dass ich mit folgendem nicht nur überprüfen lasse ob eine gewisse "Festung.exe" läuft, sondern auch on eine client.exe läuft:

Delphi-Quellcode:
Initialization
   mHandle := CreateMutex(nil, True, 'Festung.exe');
     if GetLastError = ERROR_ALREADY_EXISTS then
     begin
       ShowMessage('Programm wird bereits ausgeführt');
       Halt;
     end;

finalization
   if mHandle <> 0 then
     CloseHandle(mHandle);
Ich möchte zusätzlich, dass das Programm eine Fehlermeldung "Client.exe läuft bereits !" ausgibt, wenn dies der Fall ist. Bedingung für das abbrechen soll also sein, dass entweder eine Festung.exe bereits läuft oder eine client.exe (nichtausschließendes ODER).

Danke für eure Hilfe

Christian Seehase 13. Okt 2003 14:28

Re: Nur starten wenn anderes Programm NICHT ausgeführt wird.
 
Moin Rapthor,

so ein Abfrage gehört am Besten einmal in die Projektdatei, bevor noch Application.Initialize aufgerufen wird.
Wichtig:
Der Name den Du bei CreateMutex angibts ist nicht der Name eines Programmes, sondern ein frei wählbarer Name.

Die Prüfung funktioniert mit Mutex also nur, wenn entweder alle beteiligten Programm von Dir stammen, und Du den Namen des Mutex beeinflussen kannst, oder wenn Du weisst, wie die Mutexnamen, der Programme sind.
Sind es Fremdprogramme müsstest Du über einen anderen Weg (Hier im Forum suchenEnumWindows, Hier im Forum suchenCreateToolhelp32Snapshot) prüfen, ob sie laufen.

Mal ein Beispiel für Mutex:

Delphi-Quellcode:
program Project1;

uses
  Forms,
  windows,
  dialogs,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
  hMutex1  : DWORD;
  hMutex2  : DWORD;
  dwError1 : DWORD;
  dwError2 : DWORD;

begin
  hMutex1  := CreateMutex(nil,true,'Name des ersten Mutex');
  dwError1 := GetLastError;
  hMutex2  := CreateMutex(nil,true,'Name des zweiten Mutex');
  dwError2 := GetLastError;
  try
    if (dwError1 = ERROR_ALREADY_EXISTS) xor (dwError2 = ERROR_ALREADY_EXISTS) then begin
      if dwError1 = ERROR_ALREADY_EXISTS then begin
        ShowMessage('Meldung1');
        exit;
      end;
      ShowMessage('Meldung2');
      exit;
    end;
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  finally
    if hMutex1 <> 0 then CloseHandle(hMutex1);
    if hMutex2 <> 0 then CloseHandle(hMutex2);
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz