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 Programmstart nur 2 mal zulassen (https://www.delphipraxis.net/131811-programmstart-nur-2-mal-zulassen.html)

LokutusvB 31. Mär 2009 16:47


Programmstart nur 2 mal zulassen
 
Hallo Leute,

ich möchte in meiner Delphi-Anwendung externe Programme starten können. Das funktioniert so weit sehr gut. Nun möchte ich aber für verschiedene Applikationen den Start nicht auf einmalig (Only One Instance - Beispiele findet man ja im netz zur Genüge) setzen, sondern den Start einer Anwendung 2 mal gleichzeitig erlauben. Allerdings stehe ich zur Zeit total auf dem Schlauch, wie ich das machen soll :( . Mit getLastError = ERROR_ALREADY_EXISTS komme ich nicht wirklich weiter, das nutze ich schon für die Delphianwendung selbst.

Hat hier jemand Lösungsansätze?

mirage228 31. Mär 2009 16:52

Re: Programmstart nur 2 mal zulassen
 
Mit Semaphoren und einer bisher undokumentierten NT-Funktion könntest Du zählen (Hier im Forum suchenQuerySemaphore) z.B...

Viele Grüßer

jaenicke 31. Mär 2009 16:55

Re: Programmstart nur 2 mal zulassen
 
Du könntest zwei Mutexe benutzen, und wenn einer existiert, den zweiten für deine Instanz versuchen. Existieren beide, laufen zwei Instanzen.
Den Rest findest du ja in den Beispielen für eine Instanz.

himitsu 31. Mär 2009 16:57

Re: Programmstart nur 2 mal zulassen
 
gut, ich weiß daß es das gibt, aber die Suche findet da bestimmt auch so Einiges :zwinker:

http://www.delphipraxis.net/internal...t.php?t=153232

mjustin 31. Mär 2009 18:14

Re: Programmstart nur 2 mal zulassen
 
Zitat:

Zitat von LokutusvB
Hallo Leute,

ich möchte in meiner Delphi-Anwendung externe Programme starten können. Das funktioniert so weit sehr gut. Nun möchte ich aber für verschiedene Applikationen den Start nicht auf einmalig (Only One Instance - Beispiele findet man ja im netz zur Genüge) setzen, sondern den Start einer Anwendung 2 mal gleichzeitig erlauben. Allerdings stehe ich zur Zeit total auf dem Schlauch, wie ich das machen soll :( . Mit getLastError = ERROR_ALREADY_EXISTS komme ich nicht wirklich weiter, das nutze ich schon für die Delphianwendung selbst.

Hat hier jemand Lösungsansätze?

In der Jedi Code Library gibt es in der Unit JclAppInst Funktionen, die eine bestimmte Anzahl Instanzen zulassen (von 1 bis <beliebige Zahl>), wobei <beliebige Zahl> natürlich eine natürliche Zahl ist.

Aus der JCL Doku zu JclAppInst.pas:

Zitat:

"This unit contains a class and support routines for controlling the number of concurrent instances of your application that can exist at any time. In addition there is support for simple interprocess communication between these instance including a notification mechanism."
Cheers,

LokutusvB 1. Apr 2009 13:40

Re: Programmstart nur 2 mal zulassen
 
Vielen Dank für die Lösungsansätze.
Leider kann ich momentan damit nicht viel anfangen, da all die Lösungen auf die GUID angewiesen sind. Die Applikationen, die ich starte, besitzen keine solche ID. Allerdings konnte ich mit Hilfe von WinSight32 zumindest den Klassenname ermitteln. Kann ich mit diesem etwas anfangen,das Programm nur 2 mal starten zu lassen? Kann ich einen Mutex so einfach auf einen Klassenname setzen?

Zusatz:
Oder ist es möglich, das ganze über den Prozessname zu kontrollieren?

LokutusvB 1. Apr 2009 15:07

Re: Programmstart nur 2 mal zulassen [gelöst]
 
So habe ich das problem gelöst bzw. löse es gerade nach diesem Chema:

Laufende Prozesse auflisten, Anzahl gewünschter Prozesse ermitteln, auswerten...

Das erscheint mir einfacher als diese komplizierten und leider nur schlecht erklärten Mutex- pzw. Semaphoren-Lösungen.

QuickAndDirty 1. Apr 2009 15:18

Re: Programmstart nur 2 mal zulassen
 
Und wenn ich die EXE kopiere und umbenenne und dann Starte?

Klaus01 1. Apr 2009 15:24

Re: Programmstart nur 2 mal zulassen
 
Ein Beispiel aus der Codelib erweitert auf zwei Instanzen.
Delphi-Quellcode:
unit NichtMehrAlsZweimalStarten;

interface

implementation

uses windows,Dialogs,sysutils;

var mHandle: THandle;   // Mutexhandle

Initialization
  mHandle := CreateMutex(nil,True,'xxxxx');
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then
     begin
        CloseHandle(mHandle);
        mHandle:=CreateMutex(nil,True,'yyyyy');
        if GetLastError = ERROR_ALREADY_EXISTS then
          begin
            // Anwendung läuft zweimal
            {showMessage('Anwendung läuft bereits in zwei Instanzen');}   
            // Wenn du deine Meldung willst, mach die Klammern weg
            Halt;
          end:
     end;


finalization  // ... und Schluß 
  if mHandle <> 0 then
    CloseHandle(mHandle)
end.
Grüße
Klaus

LokutusvB 1. Apr 2009 15:26

Re: Programmstart nur 2 mal zulassen
 
Zitat:

Zitat von QuickAndDirty
Und wenn ich die EXE kopiere und umbenenne und dann Starte?

Das ist nicht möglich, da das ganze über einen Terminalserver mit automatischem Programmstart ohne Desktop und Startmenü abläuft.

An Klaus01:
Daran dachte ich auch erst, danke für die Lösung. Leider funktioniert das nicht, da die Anwendung wohl keinen eindeutigen Namen und auch keine GUID hat, oder bin ich nur zu dumm, den Namen zu ermitteln :(.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 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