Announcement

Collapse
No announcement yet.

Mehrfachen Applikationsstart verhindern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrfachen Applikationsstart verhindern

    Kennt jemand eine Methode, mit der ein mehrfaches Starten einer Applikation sicher verhindert werden kann? Die Krux dabei ist, dass die Methode mit Delphi und Kylix funktionieren muss. Auf dem WWW gibt's zwar diverse Lösungen, sie sind jedoch alle an Windos gebunden, für Linux habe ich bisher nichts gefunden.

  • #2
    Eine evtl. etwas steinzeitliche aber bewährte Methode ist beim Programmstart eine Datei zu erstellen. Existiert diese Datei wird das Programm beendet bzw nicht gestartet. Existiert diese Datei nicht wird diese Datei erstellt und das Programm läuft normal weiter. Wird das Programm beendet wird die Datei wieder gelöscht. In etwa so:<br><br>

    Beim Öffnen <br><br>

    Procedure OpenPGM;<br>
    var<br>
    checkvar : file;<br>
    begin<br>
    if fileexist('open.dat') then <br>
    halt<br>
    else<br>
    begin<br>
    assignfile(checkfile, 'open.dat');<br>
    rewrite(checkfile);<br>
    closefile(checkfile);<br>
    end; <br>
    end;<br><br>

    Beim Beenden<br><br>

    Procedure ClosePGM;<br>
    begin<br>
    deletefile('open.dat');
    end;<br><br>
    Wie gesagt, zwar nicht die schönste Methode aber recht zuverlässig und ein grosser Vorteil weder system noch sprachenabhänig.<br><br>
    Gruß Fran

    Comment


    • #3
      Hallo Frank,<br>bei etwas zittrigen Usern versagt die Methode aber. Bei zwei Doppelklicks kurz hintereinander könnten doch zwei Instanzen starten. Was passiert, wenn das Programm o. Rechner abschmiert. Wer löscht dann die Datei? <br>Jens Schuman

      Comment


      • #4
        Ganz einfach. Die Datei wird im exclusiv Modus geöffnet. Schmirt die APP ab wird normalerweise durchs Windows diese Datei wieder zur Verfügung gestellt. D.h. beim Programmstart muss 1. geschaut werden ob die Datei existiert und 2. wenn ja ob sie den gelöscht werden kann.
        Ok das ist immer noch nicht perfekt.

        Gruß Hage

        Comment


        • #5
          Füge DEinem Projekt folgende Unit hinzu und es funktioniert.

          <body>

          <p>{In diesem Modul erfolgt die Prüfung, ob die Anwendung bereits<br>
          geöffnet ist.}<br>
          unit CheckApp;<br>
          <br>
          interface<br>
          <br>
          uses<br>
          windows, sysutils, Dialogs, Controls;<br>
          <br>
          implementation<br>
          <br>
          uses<br>
          <br>
          var mHandle : THandle; // Mutexhandle der ersten Instanz<br>
          <br>
          //Wird bei Initialisierung der Anwendung ausgeführt<br>
          Initialization<br>
          begin<br>
          </p>
          <p>&nbsp;&nbsp;&nbsp; mhandle := CreateMutex(nil, True, PChar(ExtractFileName(ParamStr(0))));<br>
          &nbsp;&nbsp;&nbsp; If GetLastError = ERROR_ALREADY_EXISTS then //Anwendung
          läuft bereits<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Halt;</p>
          <p>end;<br>
          <br>
          finalization<br>
          //Schließen des Handles wenn nur noch eine Anwendung geöffnet ist<br>
          if mHandle &lt;> 0 then<br>
          &nbsp;&nbsp;&nbsp; CloseHandle(mHandle);<br>
          end.<br>
          </p>

          </body>

          Gruß Andrea

          Comment


          • #6
            CreateMutex ist eine Windows API-Funktion, eine Entsprechung unter Linux gibt es (meines Wissens) nicht.

            Gruss Hp

            Comment

            Working...
            X