AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nur eine Instanz des Programms

Ein Thema von rebugger · begonnen am 7. Nov 2002 · letzter Beitrag vom 8. Nov 2002
Antwort Antwort
Seite 1 von 2  1 2      
rebugger

Registriert seit: 29. Okt 2002
Ort: Auerbach
190 Beiträge
 
Delphi 7 Professional
 
#1

Nur eine Instanz des Programms

  Alt 7. Nov 2002, 17:39
Hallo,
weiß net so recht, ob das hier rein passt... Bitte verschieben, falls nötig.

Wie kann ich einen weiteren Programm-Start verhindern ?
Also, dass nur max. eine Instanz meines Programms geöffnet ist.
Habe zwar einige Komponenten gefunden, wollte aber dann doch den Quellcode, dass mein Programm nicht so aufbläht.

Wäre schön, wenn jemand eine Lösung hätte !
[edit=FuckRacism]AB nach WinAPI[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von RomanK
RomanK

Registriert seit: 7. Jun 2002
Ort: Kirchheim unter Teck
1.036 Beiträge
 
Delphi 7 Personal
 
#2
  Alt 7. Nov 2002, 17:43
Sers rebugger,
das hier ist aus dem EDH:

Zitat:
Verhindern, das ein Programm mehrmals gestartet werden kann


Diese paar Zeilen Code verhindern, dass Dein Programm mehrmals gestartet werden kann.
Schreibe dies ans Ende Deiner Unit (am Besten Unit des Hauptformulars):
Delphi-Quellcode:
Initialization
  mHandle:=CreateMutex(nil,True,'Programmname');
  if GetLastError=ERROR_ALREADY_EXISTS then
    Halt;

finalization
  if mHandle<>0 then
    CloseHandle(mHandle)

end.
Du musst natürlich noch die globale Variable mHandle: THandle deklarieren (z.B. da wo Form1: TForm1 steht).

Als 'Programmname' kann eine beliebige Bezeichnung eingesetzt werden.
Roman Keller
Krieg ist Gottes Art den Amerikanern Geographie beizubringen!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 7. Nov 2002, 18:27
Hi,

Stichwort : "Semaphoren", bitte suchen, hab den Link gerade nicht.

Gruß
Hansa
  Mit Zitat antworten Zitat
DKamps

Registriert seit: 7. Nov 2002
Ort: Unna
30 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 7. Nov 2002, 18:45
Auf jeden Fall sollte das über die Windows API funktionieren. Beim Start musst Du nachsehen, ob es bereits ein Fenster mit dem gleichen Namen gibt. Wenn ja: MainForm.Close
Leider habe ich den Quellcode von den API-Aufrufen nicht greifbar, aber mein Mitarbeiter hat ein Beispiel im Forum gefunden.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 7. Nov 2002, 18:57
Jungs zerbrecht euch nicht weiter den Kopf. Die Lösungt ist der Mutex bzw. der Semaphor, wobei ich den Mutex vorziehen würde (, weil ich es mit dem Semapohor noch nie gemacht habe ).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6
  Alt 7. Nov 2002, 19:13
Also ich würde Semaphore vorziehen.. soweit ich weiß kann es mit Mutex Probleme geben! Es gibt Microsoft-Dokumentationen laut denen es vorkommen kann (zumindenst unter Win9x) dass Mutexe nicht korrekt freigegeben werden!
Manuel Pöter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 7. Nov 2002, 19:15
Der Mutex entspricht auch viel mehr dem gewünschten Ergebnis, da er im Prinzip als Boolean gesehen werden kann. Ein Semaphore hingegen ist ein "Integer", dessen Wert erniedrigt und erhöht wird. Man kann bei Semaphoren den maximalen Wert festlegen, ab dem geblockt wird. Ein Mutex entspricht somit einem Semaphore mit dem Maximalen Wert 1, nur mit weniger Verwaltungsaufwand.
Da das Programm sowieso nur 1x gestartet werden darf, kommt hier ein Mutex eher in betracht.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8
  Alt 7. Nov 2002, 19:40
Hi Leute,

habt ihr nichts zu tun ? Code folgt noch. Habe hier eine Function, die in das DPR rein muß, z.B.

IF BereitsAktiv THEN
Aplication.Terminate;

Mutex ist meiner Ansicht nach nicht so gut. Mit Semaphoren (griech.: Signalflagge) wird Windows angezeigt, daß die Anwendung bereits läuft. Bei meinem Bsp. sieht das folgendermaßen aus.

1. User startet Programm und gibt eine halbe Rechnung ein.
2. User macht was anderes und vergißt die halbe Rechnung.
3. Er startet Programm wieder.
4. Semaphore teilt dem Programm mit es sei gestartet, schließt die zweite Instanz und startet sich selbst, wobei es wieder genau mitten in der halben Rechnung steht. Also genau nach dem "Zwischenfall".

Delphi-Quellcode:
unit sema;

interface

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

function BereitsAktiv: Boolean;

IMPLEMENTATION

function BereitsAktiv: Boolean;
var
  semName,
  appClass: PChar;
  hSem : THandle;
  hWndMe : HWnd;
  appTitle: Array[0..MAX_PATH] of Char;
begin
  // Init
  Result := FALSE;
  GetMem(semName,15);
  GetMem(appClass,15);
  StrPCopy(semName,'sema');
  StrPCopy(appClass,'TApplication');
  StrPCopy(appTitle,ExtractFileName(Application.Title));

  // Create a Semaphore in memory. If this is the
  // first instance, then hSem's value should be 0.
  hSem := CreateSemaphore(nil,0,1,semName);

  // Check to see if the semaphore exists
  if (hSem <> 0) and (GetLastError() =
                      ERROR_ALREADY_EXISTS) then
    begin
      CloseHandle(hSem);

      // Get the current window's handle then change
      // its title so we can look for the other instance
      hWndMe := FindWindow(appClass,appTitle);
      SetWindowText(hWndMe,'ZZZZZZZ');

      // Search for other instance of this window then bring
      // it to the top of the Z-order stack. We find it by
      // matching the Application Class and
      // Application Title.
      hWndMe := FindWindow(appClass,appTitle);
      if (hWndMe <> 0) then
        begin
          BringWindowToTop(hWndMe);
          ShowWindow(hWndMe,SW_SHOWNORMAL);
        end;

      Result := TRUE;
    end;

  // Destroy PChars
  FreeMem(semName,15);
  FreeMem(appClass,15);
end;

end.
Wem das nicht reicht, soll sich mit Mutex (warum aber ?) beschäftigen. Mir ging es darum, zu verhindern, daß ein Programm 10mal in der Taskleiste steht, was vorher nicht eingeplant war. Mit diesem Bsp. kann man es so oft starten, wie man will, es landet immer nur bei einer Instanz. Ein Start mehrerer wird verhindert, da es immer bei der ersten landet.

Quelltext ist getestet und funktioniert, bis auf die Einbindung in DPR. Da könnte ein Fehler drin sein, aber die eventuelle Korrektur kann ich nachliefern.

Gruß
Hansa
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 7. Nov 2002, 21:11
Moin Zusammen,

ein Mutex hat den prinzipiellen Nachteil, dass er im Falle eines Programmabsturzes, ohne geregeltes Ende, nicht wieder freigegeben wird, was dann, in letzter Konsequenz, heisst, dass das Programm bis zum Neustart des Rechners nicht mehr gestartet werden kann.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#10
  Alt 7. Nov 2002, 21:45
Zitat von Luckie:
wobei ich den Mutex vorziehen würde (, weil ich es mit dem Semapohor noch nie gemacht habe ).
Das ist doch mal ne Aussage.
ROTFL - ROTFL - ROTFL

Tränen lachend, Daniel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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