Anwendung auf knopfdruck restarten



  • Hallo zusammen,

    gibt es einen Befehl, mit dem ich auf Knopfdruck meine Anwendung beenden kann und diese dann anschliessend wieder automatisch startet ?

    Gruss
    chloe



  • Solange Du keinen Mutex o.ä. einsetzt, reicht es doch die Anwendung per ShellExecute neu zu starten und dann erst die laufende Instanz zu beenden.



  • Hallo

    sollte grundsätzlich mit einem

    ShellExecute(<Name des eigenes Programms>) ;
    Application->Terminate();
    

    gehen

    Allerdings dürfte eine saubere interne Reinitialisierung besser sein.

    bis bald
    akari



  • Vielen Dank hat funktioniert!



  • hier mal ein kleines beispiel falls du nen mutex hast (konsolenexperte und konsolen-anwendung deaktivieren damit man die WinMain bekommt):

    Programmtitel ist der Name deines Programms. Das Programm wartet nun bis die Anwendung mit dem Titel Programmtitel nicht mehr gefunden wird und startet sie dann erneut.

    #include <windows.h>
    
    WINAPI WinMain(HINSTANCE handle, HINSTANCE, LPSTR CmdLine, int)
    {
      // warten bis Anwendung nicht mehr gefunden wird
      while (FindWindow(NULL, "Programmtitel")) Sleep(250);
    
      LPTSTR filepath = new TCHAR[MAX_PATH];
    
      // aktuelles verzeichnis holen
      if (GetModuleFileName(handle, filepath, MAX_PATH))
      {
        char drive[_MAX_DRIVE];
        char dir[_MAX_DIR];
        char file[_MAX_FNAME];
        char ext[_MAX_EXT];
    
        // pfad extrahieren
        _splitpath(filepath, drive, dir, file, ext);
        _makepath(filepath, drive, dir, "", "");
    
        if (((int) ShellExecute(NULL, "open", strcat(filepath, CmdLine), NULL, NULL, SW_SHOWNORMAL)) <= 32)
          MessageBox((HWND) handle, "Fehler beim Neustarten der Anwendung...", "Fehler", MB_OK);
      }
    
      delete [] filepath;
    
      return 0;
    }
    

    das kompilieren und die exe in das Verzeichnis deiner anwendung legen.
    in deinem eigentlichen Programm machst du dir ne kleine hilfs-funktion zum neustarten:

    //---------------------------------------------------------------------------
    // Startet die Anwendung neu
    //---------------------------------------------------------------------------
    void AutoRestart()
    {
      // Hilfsprogramm starten
      // -> Pfad der Anwendung
      // -> Name der Exe der Anwendung
      ShellExecute(0, "open", (ExtractFilePath(Application->ExeName) + "restart.exe").c_str(), 
                   ExtractFileName(Application->ExeName).c_str(), 0, SW_SHOWNORMAL);
    
      // Anwendung abschießen              
      Application->ProcessMessages();
      Application->Terminate();
      Application->ProcessMessages();
    }
    

    ist schon ein paar jahre alt der code und schon lange nicht mehr gepflegt wurden, aber ich hoffe es funktioniert noch.



  • akari schrieb:

    Hallo

    sollte grundsätzlich mit einem

    ShellExecute(<Name des eigenes Programms>) ;
    Application->Terminate();
    

    gehen

    Allerdings dürfte eine saubere interne Reinitialisierung besser sein.

    bis bald
    akari

    laut kompiler sind das zu wenig parameter!



  • Hallo

    ich habe extra grundsätzlich dazu geschrieben.
    Wenn du die Forumssucher benutzt hättest, hättest du zum Beispiel diesen Thread gefunden, der dich über die vollständige Syntax der Funktion
    aufklärt.

    bis bald
    akari


Anmelden zum Antworten