Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prüfen, ob eine Anwendung läuft (https://www.delphipraxis.net/39077-pruefen-ob-eine-anwendung-laeuft.html)

emsländer 28. Jan 2005 11:37


Prüfen, ob eine Anwendung läuft
 
Moin,

ich habe aus der Codelibrary folgende Funktion eingesetz: http://www.delphipraxis.net/internal...ct.php?t=30942

Allerdings ein wenig verändert, damit es an meine Applikation passt:

Delphi-Quellcode:
function TFrm_login.GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

function TFrm_login.GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

function TFrm_login.laufzeitcheck : boolean;
var
  hProcess: THandle;
  wf: DWORD;
begin
  result := true;
  hProcess := GetProcessHandleFromID(GetProcessID('Anwendung.exe'));
  if hProcess = 0 then result := false; // läuft nicht
end;
mein Aufruf ist folgendermaassen:

if not laufzeitcheck then begin
start applikation
...
...
...
...
end
else begin
showmessage('Applikation läuft bereits');
end;


Allerdings wird in jedem fall in die Variable hProcess <> 0.
Somit kann die Applikation nie gestartet werden.


Wer hat eine Idee?

Gruss

EL

SubData 28. Jan 2005 11:44

Re: Prüfen, ob eine Anwendung läuft
 
Ist logisch, da dein Programm ja schon im Speicher ist, wenn geprüft wird ob dein Programm geladen wird...

Jelly 28. Jan 2005 11:57

Re: Prüfen, ob eine Anwendung läuft
 
Alternativ kannst du auch im OnCreate Ereignis über FindWindow gehen. Da im OnCreate das eigene Fensterhandle noch nicht erzeugt ist, wirst du deine eigene Anwendung somit auch nicht finden, sondern nur eine eventuell laufende.

emsländer 28. Jan 2005 20:50

Re: Prüfen, ob eine Anwendung läuft
 
Zitat:

Zitat von Jelly
Alternativ kannst du auch im OnCreate Ereignis über FindWindow gehen. Da im OnCreate das eigene Fensterhandle noch nicht erzeugt ist, wirst du deine eigene Anwendung somit auch nicht finden, sondern nur eine eventuell laufende.

Hast Du da bitte mal ein Beispiel?

Gruss

EL

DelphiFreund 28. Jan 2005 21:21

Re: Prüfen, ob eine Anwendung läuft
 
Du könntest auch ein Semaphore benutzten. Für Details bin ich zu müde. Aber die Delphi-Praxis-Suche sollte trotzdem ausreichen.


Gruß DelphiFreund

Jelly 28. Jan 2005 21:27

Re: Prüfen, ob eine Anwendung läuft
 
Meine Idee schlug fehl... Über FindWindow ist die eigene Anwendung bereits findbar. Ne andere Möglichkeit fällt mir aber im Moment auch nicht ein?

DelphiFreund 28. Jan 2005 21:36

Re: Prüfen, ob eine Anwendung läuft
 
Dann bin ich dran:

Delphi-Quellcode:
const
  MyGUID = 'hex-Zahl';
var
  Semaphore: THandle;

begin
  ActivationMessage := RegisterWindowMessage(PChar(MyGUID));

  Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));

  if (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    ShowMessage('Das Programm läuft schon');
    Exit;
  end;
end;
Die MyGuid sollte eine GUID sein, muss es gaub ich aber nicht


Gruß und gute Nacht DelphiFreund

Jens Schumann 28. Jan 2005 21:38

Re: Prüfen, ob eine Anwendung läuft
 
Hallo,
das Beispiel von DelphiFreund ist schon ganz gut. Du musst es direkt im Projektquelltext vor dem ersten Application.CreateForm einbauen.

P.S. am Ende der Anwendung CloseHandle(Semaphore); nicht vergessen. Ist zwar nicht nötig, da Windows alle Objekthandles selber schliesst wenn der primäre Thread terminiert. Wenn alle Objekthandles geschlossen sind entfernt Windows automatisch das Semaphore-Objekt. Sieht aber besser aus.

DelphiFreund 28. Jan 2005 21:42

Re: Prüfen, ob eine Anwendung läuft
 
Sorry, das hab ich vergessen zu erwähnen. Danke für den Hinweis.

emsländer 28. Jan 2005 21:48

Re: Prüfen, ob eine Anwendung läuft
 
Zitat:

Zitat von Jens Schumann
Hallo,
das Beispiel von DelphiFreund ist schon ganz gut. Du musst es direkt im Projektquelltext vor dem ersten Application.CreateForm einbauen.

P.S. am Ende der Anwendung CloseHandle(Semaphore); nicht vergessen. Ist zwar nicht nötig, da Windows alle Objekthandles selber schliesst wenn der primäre Thread terminiert. Wenn alle Objekthandles geschlossen sind entfernt Windows automatisch das Semaphore-Objekt. Sieht aber besser aus.

Erst einmal danke. Jetzt meckert mir der Compiler den hier an:

ActivationMessage := RegisterWindowMessage(PChar(MyGUID));

Gruss

EL

DelphiFreund 28. Jan 2005 21:50

Re: Prüfen, ob eine Anwendung läuft
 
Ich glaub man braucht die Unit Windows, oder SysUtils, schau am besten in die Hilfe.

emsländer 28. Jan 2005 22:02

Re: Prüfen, ob eine Anwendung läuft
 
Moin,

so hab den Rat des Kollegen befolgt und diese Routine "geklaut":

Delphi-Quellcode:
const
  MyGUID = 'hex-Zahl';
var
  Semaphore: THandle;
   ActivationMessage : integer;
var b_Ok : Boolean;

begin
  ActivationMessage := RegisterWindowMessage(PChar(MyGUID));
  Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));
  if (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    ShowMessage('Manager läuft bereits'+#10#13+
                'und kann nicht mehrfach gestartet werden');
    CloseHandle(Semaphore);
    Exit;
  end;
  CloseHandle(Semaphore);
  progstart := true;
  Application.Initialize;
  Einstell := TEinstellungen.Create;
  Einstell.load;
  // LOginmaske erzeugen
  Frm_login := TFrm_login.Create(nil);
  // durch try finally sicherstellen das Form freigegeben wird
    try
      b_Ok := Frm_login.login;
    finally
      FreeAndNil(frm_Login);
    end;
    progstart := true;
    if (b_Ok) and (not sfirststart) then begin
      Application.Title := 'Manager';
      Application.CreateForm(TfrmMain, frmMain);
      Application.CreateForm(TfrmLizenzDaten, frmLizenzDaten);
      Application.CreateForm(TfrmZinsen, frmZinsen);
      Application.CreateForm(TPDF, PDF);
      Application.CreateForm(TfrmNetzwerk, frmNetzwerk);
      Application.CreateForm(Tprogramminfo, programminfo);
      Application.Run;
    end;
  freeandnil (einstell);
end.

Es tuet sich leider nix ... Ich kann nach wie vor mehrfach starten. :(


Gruss

EL

Armageddon 28. Jan 2005 22:07

Re: Prüfen, ob eine Anwendung läuft
 
Vielleicht kannst Du ja was mit den LMD-TOOLS SE anfangen. Da hab ich was schönes gefunden das ich immer verwende. Ist einfach und funktioniert. Heisst glaub OneInstance oder so. Echt easy.

kiar 28. Jan 2005 22:10

Re: Prüfen, ob eine Anwendung läuft
 
hallo el,

schau mal hier http://www.luckie-online.de/Delphi/Importe/Nico/

raik

Sprint 28. Jan 2005 22:14

Re: Prüfen, ob eine Anwendung läuft
 
Zitat:

Zitat von emsländer
Ich kann nach wie vor mehrfach starten.

Ist ja auch kein wunder. CloseHandle erst aufrufen, wenn das Programm wieder beendet wird.

emsländer 28. Jan 2005 22:18

Re: Prüfen, ob eine Anwendung läuft
 
Zitat:

Zitat von Sprint
Zitat:

Zitat von emsländer
Ich kann nach wie vor mehrfach starten.

Ist ja auch kein wunder. CloseHandle erst aufrufen, wenn das Programm wieder beendet wird.


:wall: :wall: :wall: :wall: :wall: klappt jetzt :wall: :wall: :wall: :wall:

Danke !!!!




Gruss

EL

Sprint 28. Jan 2005 22:21

Re: Prüfen, ob eine Anwendung läuft
 
Wenn die bereits laufende Anwendung nicht informiert werden soll, das der Benutzer versucht das Programm mehr als einmal zu starten, dann reicht es auch, wenn du es so schreibst:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  AppHandle: THandle;

initialization
  AppHandle := CreateSemaphore(nil, 0, 1, '{FCAE1E10-4533-4A5B-9710-05BF647B6A1C}');
  if GetLastError = ERROR_ALREADY_EXISTS then
    Halt(0);

finalization
  if AppHandle <> 0 then
    CloseHandle(AppHandle);

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr.

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