Announcement

Collapse
No announcement yet.

Verhindern, daß Anwendung 2 mal getartet wird

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

  • Verhindern, daß Anwendung 2 mal getartet wird

    ich verwende folgenden Code, um zu verhindern, daß eine Anwendung 2 mal gestartet werden kann:

    <br>
    //OnCreate: <br>
    void __fastcall TMainForm::FormCreate(TObject *Sender) <br>
    {<br>
    CreateMutex(NULL, true, Application->Title.c_str());<br>
    if (GetLastError() == ERROR_ALREADY_EXISTS)<br>
    {<br>
    Application->Terminate();<br>
    }<br>
    ...<br>
    <br>

    Beim zweiten Startversuch der Anwendung wird diese auch sofort wieder geschlossen; <b>aber</b>, im Task-Manager ist die zweite Anwendung immer noch vorhanden. <br>
    Was ist hier falsch?<br>
    <br>
    MfG JB

  • #2
    Hallo Jan,

    versuch es mal mit dieser Methode, die in WinMain() stehen muß:
    </br>
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    </br>
    // Verhindern, daß mehr als eine Instanz des Programms gestartet werden kann
    HANDLE mutex;
    </br>
    try
    {
    const char mutexname[] = "AppSingle"; // eindeutige Zeichenkette für diese Applikation

    // Existiert dieser Mutex bereits?
    mutex = OpenMutex( 0, false, mutexname );
    if( mutex == NULL )
    {
    // Der Mutex ist nicht vorhanden, d.h. es läuft noch keine Instanz
    // Also einen Mutex erzeugen, damit eine weitere Instanz sehen kann,
    // daß das Programm schon läuft.
    mutex = CreateMutex( NULL, true, mutexname );
    }
    else
    {
    // Der Mutex existiert schon, also sofort abbrechen
    MessageBox( 0, "Only one instance can be started", "Technical error", MB_OK | MB_ICONSTOP | MB_TOPMOST );
    return( 0 );
    }

    Application->Initialize();
    Application->Title = "MyApp";
    Application->CreateForm(__classid(TXMMainWindow), &XMMainWindow);
    Application->Run();
    }
    catch( Exception& exception )
    {
    Application->ShowException( &exception );
    }
    ReleaseMutex( mutex );
    return 0;
    }

    Grüße

    Wieland Schol

    Comment


    • #3
      Hallo Jan,
      <p>
      versuch es mal mit dieser Methode, die in WinMain() stehen muß:
      <p>
      WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)<p>
      {<p>
      // Verhindern, daß mehr als eine Instanz des Programms gestartet werden kann<p>
      HANDLE mutex;<p>
      try<p>
      {<p>
      const char mutexname[] = "AppSingle"; // eindeutige Zeichenkette für diese Applikation<p>

      // Existiert dieser Mutex bereits?<p>
      mutex = OpenMutex( 0, false, mutexname );<p>
      if( mutex == NULL )<p>
      {<p>
      // Der Mutex ist nicht vorhanden, d.h. es läuft noch keine Instanz<p>
      // Also einen Mutex erzeugen, damit eine weitere Instanz sehen kann<p>,
      // daß das Programm schon läuft.<p>
      mutex = CreateMutex( NULL, true, mutexname );<p>
      }<p>
      else<p>
      {<p>
      // Der Mutex existiert schon, also sofort abbrechen<p>
      MessageBox( 0, "Only one instance can be started", "Technical error", MB_OK | MB_ICONSTOP | MB_TOPMOST );<p>
      return( 0 );<p>
      }<p>

      Application->Initialize();<p>
      Application->Title = "MyApp";<p>
      Application->CreateForm(__classid(TXMMainWindow), &XMMainWindow);<p>
      Application->Run();<p>
      }<p>
      catch( Exception& exception )<p>
      {<p>
      Application->ShowException( &exception );<p>
      }<p>
      ReleaseMutex( mutex );<p>
      return 0;<p>
      }<p>

      Grüße

      Wieland Schol

      Comment


      • #4
        Hi,

        das sieht doch alles viel zu kompliziert aus. In der projekt Datei überprüft man einfach mit der API - Funktion FindfWindow, ob das Fenster schon existiert. Wenn nicht, dann läßt man das Programm starten. Man brauchst jediglich den Text, der im Caption der Form steht. Ich C++ Builder kann dieses aber nicht getestet werden, weil sonst das Fenster gefunden wird, auf dem entwickelt wird und so kann die Anwendung nicht gestartet werden, also ganz normal kompilieren und im Explorer starten. Wenn du ein Beispeil brauchst, sag einfach bescheid.

        Gruß Philip

        Comment


        • #5
          Ich hatte ja ein ähnliches Problem, da hatte Philip mir auch diesen Tip gegeben (nochmal Danke). Man kann das hier im BC++Builder Ordner nachlesen. Beim Start des Programms wird vor dem FormCreate schon ein Dummy-Fenster angelegt. Deshalb habe ich in der Entwicklungsumgebung einen anderen Fenstertitel und setze erst in FormCreate das endgültige Caption. Das FindWindow steht in WinMain vor dem try-Block. Das alles funktioniert natürlich nur dann, wenn der Fenstertitel nicht variabel ist
          Günther

          Comment


          • #6
            Vielen Dank, denen, die mir geantwortet haben. Ich habe den Vorschlag von ausprobiert.

            Das Problem besteht darin, wo die Funktion CreateMutex aufgerufen wird. Im Ereignis-Handler OnCreate können schon Probleme auftreten; je nach dem, was sich im Hauptfenster für Objekte befinden. Am besten man ruft CreateMutex in der Funktion WinMain auf.
            Daß die Applikation nur einmal startet ist mit 3 Zeilen zu programmieren:

            WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
            {
            try
            {
            // Anwendung nur ein mal öffnen!:
            <b>Fett</b>CreateMutex(NULL, true, "Anwendungsname");
            <b>Fett</b>if (GetLastError() == ERROR_ALREADY_EXISTS)
            <b>Fett</b>return 0;

            Application->Initialize();
            Application->CreateForm(__classid(TMainForm), &MainForm);
            Application->Run();
            }
            catch (Exception &exception)
            {
            Application->ShowException(&exception);
            }
            return 0;
            }

            Was ist eigentlich ein Mutexobjekt?

            Mit freundlichen Grüßen
            J

            Comment


            • #7
              <p>Hier gin wohl die Formatierung etwas daneben!
              <p>
              <p>Vielen Dank, denen, die mir geantwortet haben. Ich habe den Vorschlag von ausprobiert.
              <p>
              <p>Das Problem besteht darin, wo die Funktion CreateMutex aufgerufen wird. Im Ereignis-Handler OnCreate können schon Probleme auftreten; je nach dem, was sich im Hauptfenster für Objekte befinden. Am besten man ruft CreateMutex in der Funktion WinMain auf.
              Daß die Applikation nur einmal startet ist mit 3 Zeilen zu programmieren:
              <p>
              <p>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
              <p>{
              <p> try
              <p> {
              <p> // Anwendung nur ein mal öffnen!:
              <p> <b>CreateMutex(NULL, true, "Anwendungsname"); </b>
              <p> <b>if (GetLastError() == ERROR_ALREADY_EXISTS) </b>
              <p> <b>return 0; </b>
              <p>
              <p> Application->Initialize();
              <p> Application->CreateForm(__classid(TMainForm), &MainForm);
              <p> Application->Run();
              <p> }
              <p> catch (Exception &exception)
              <p> {
              <p> Application->ShowException(&exception);
              <p> }
              <p> return 0;
              <p>}
              <p>
              <p>Was ist eigentlich ein Mutexobjekt?
              <p>
              <p>Mit freundlichen Grüßen
              <p>J

              Comment


              • #8
                Vielen Dank, denen, die mir geantwortet haben. Ich habe den Vorschlag von Wieland Scholz ausprobiert.
                <p>
                Das Problem besteht darin, wo die Funktion CreateMutex aufgerufen wird. Im Ereignis-Handler OnCreate können schon Probleme auftreten; je nach dem, was sich im Hauptfenster für Objekte befinden. Am besten man ruft CreateMutex in der Funktion WinMain auf.
                Daß die Applikation nur einmal startet ist mit 3 Zeilen zu programmieren:
                <p>
                <p>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
                <p>{
                <p>try
                <p>{
                <p>// Anwendung nur ein mal öffnen!:
                <p><b>CreateMutex(NULL, true, "Anwendungsname"); </b>
                <p><b>if (GetLastError() == ERROR_ALREADY_EXISTS) </b>
                <p><b>return 0; </b>
                <p>
                <p>Application->Initialize();
                <p>Application->CreateForm(__classid(TMainForm), &MainForm);
                <p>Application->Run();
                <p>}
                <p>catch (Exception &exception)
                <p>{
                <p>Application->ShowException(&exception);
                <p>}
                <p>return 0;
                <p>}
                <p>
                Was ist eigentlich ein Mutexobjekt?
                <p>
                <p>Mit freundlichen Grüßen
                <p>J

                Comment


                • #9
                  Ergänzung:
                  Die verschiedenen Möglichkeiten hat
                  u.a. Mr. How im Artikel
                  http://www.bcbdev.com/faqs/faq74.htm
                  beschrieben.
                  Gruß Jör

                  Comment

                  Working...
                  X