Hallo,
wie kann ich innerhalb einer QT Anwendung eine externe Datei (z.B. exe Datei) starten/ausführen? Ich glaube es funktioniert mit QProcess... Hat jemand damit Erfahrung oder vielleicht ein paar Code Schnimpsel? Mir fehlt diesbezüglich absolut der Durchblick.
Zusatz:
Ist es möglich einen unabhängigen Prozess zu beenden? Bsp.: Man startet 2 QT Anwendungen und kann mit einer Funktion in einer Anwendung die andere schließen?
Hintergrund: Ich möchte ein automatische Updateroutine erstellen, welche im Hauptprogramm gestartet wird und die Hauptanwendung schließt. Anschließend wird einfach die auszuführende Datei der Hauptanwendung ersetzt.
Bitte um Hilfe.
Externe Datei starten
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Ich denke die Dokumentation von QProcess ist für diesen Fall ausreichend.
Bei einem vernünftigen Betriebssystem könnte man die Anwendung ohne Probleme auf der Platte ersetzen... Ansonsten würde ich meine Anwendung so aufbauen, daß das Hauptprogramm nur Bibliotheken nachlädt und die Bibliotheken das eigentlich Programm darstellen. Die sollte man nämlich ohne Probleme austauschen können... (Notfalls lädt man halt immer nur die neueste Version...)
Bei einem vernünftigen Betriebssystem könnte man die Anwendung ohne Probleme auf der Platte ersetzen... Ansonsten würde ich meine Anwendung so aufbauen, daß das Hauptprogramm nur Bibliotheken nachlädt und die Bibliotheken das eigentlich Programm darstellen. Die sollte man nämlich ohne Probleme austauschen können... (Notfalls lädt man halt immer nur die neueste Version...)
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
So kannst du ein Programm starten.
Ich benutze einfach "gup". Den Updater, den auch Notepad++ verwendet und der unter der LGPL steht.
https://gup-w32.svn.sourceforge.net/svnroot/gup-w32
Code: Alles auswählen
QString sTool = no_tr("gup.exe");
if (!QFile::exists(sTool)) {
QMessageBox::critical(
this, "Fehler...",
tr("%1 kann nicht gefunden werden.").arg(sTool)
);
return;
}
QProcess::startDetached(sTool);
https://gup-w32.svn.sourceforge.net/svnroot/gup-w32
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Danke
Hi Thorsten, vielen Dank... genau nach dem habe ich gesucht... Werde ich gleich mal reinschauen.
Eine Frage hätte ich noch: Wie funktioniert das Starten von Linux Programmen. Hab dein Bsp. getestet und die Endung einfach weggelassen. Das Programm wird gefunden startet jedoch nicht.
Weiters soll mein Programm auf Linux und Windoof laufen. Natürlich kann es dabei zu Problemen kommen, spezielle was die Endungen anbelangt.
Muss ich dann 2 Updater Versionen zu Verfügung stellen oder kann ich eine "Weiche" einbauen. Sprich wenn es für win32 kompiliert wird soll jener Programmteil verwendet werden und sonst der andere?
Eine Frage hätte ich noch: Wie funktioniert das Starten von Linux Programmen. Hab dein Bsp. getestet und die Endung einfach weggelassen. Das Programm wird gefunden startet jedoch nicht.
Weiters soll mein Programm auf Linux und Windoof laufen. Natürlich kann es dabei zu Problemen kommen, spezielle was die Endungen anbelangt.
Muss ich dann 2 Updater Versionen zu Verfügung stellen oder kann ich eine "Weiche" einbauen. Sprich wenn es für win32 kompiliert wird soll jener Programmteil verwendet werden und sonst der andere?
oder kann ich eine "Weiche" einbauen. Sprich wenn es für win32 kompiliert wird soll jener Programmteil verwendet werden und sonst der andere?
Code: Alles auswählen
#ifdef Q_OS_WIN
....
#else
....
#endif
qt-xyz/src/corelib/global/qglobal.h
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Gelöst
Vielen Dank für die rasche und gute Hilfe.
Hab für mich folgede Lösung ausgearbeitet:
Hab für mich folgede Lösung ausgearbeitet:
Code: Alles auswählen
// Programm starten
#ifdef Q_OS_WIN
QString program = "epm.exe";
#else
QString program = "./epm";
#endif
QProcess *myProcess = new QProcess(this);
myProcess->start(program);
if (myProcess->error()==1 ) {
updateText += "<b>Starten fehlgeschlagen!</b>";
qDebug() << updateText;
}
else
{
this->close();
}