Delphi-PRAXiS
Seite 1 von 2  1 2      

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 10: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 10: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 10: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 19: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 20: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 20: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 20: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 20: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 20: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 20: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


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.
Seite 1 von 2  1 2      

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