[QHttp] Télécharger un exécutable et le lancer
Bonjour à tous.
Je m'arrache les cheveux depuis quelques jours. Ce que je veux faire est simple : télécharger un exécutable, puis l'exécuter.
Le téléchargement fonctionne à merveille, le fichier obtenu n'est pas corrompu, il est similaire en tout point à l'original (j'arrive à l'exécuter et-tout-ça).
En revanche, le lancement pause problème, la fonction QProcess::start() retourne l'erreur 5 (Erreur inconnue). Il semblerait en effet que lorsque cette fonction est appelée par mon programme, le fichier téléchargé ne fait que 25994 octets au lieu des 34816 (que font programme.exe sur le serveur et programme.exe sur mon disque une fois tout terminé).
Voici comment j'ai procédé :
Dans le main je crée un QHttp et je lui demande de télécharger mon programme.exe ; je connecte aussi le signal done(bool) à un slot perso.
Ce slot ouvre un fichier log, vérifie que programme.exe est bien présent, et tente de l'exécuter.
Voici le log créé :
Citation:
Upgrading date : jeu. 30. oct. 14:07:08 2008
Successfull download of the new version of programme.exe
Launching programme.exe (25994 Bytes) : Error #5
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <QtCore>
#include <QtNetwork>
#include <QProcess>
const QString qs_nrchost = "programme.exe";
const QString qs_log = "upgrading.log";
class upgrader : public QObject
{
Q_OBJECT
public slots:
// Slot appelé lorsque le téléchargement est fini
void onDownloadComplete(bool error)
{
// Log
QFile qf_log(qs_log);
QTextStream qts_out;
bool bol_logOpened = qf_log.open(QIODevice::Append|QIODevice::Text);
if(bol_logOpened)
{
qts_out.setDevice(&qf_log);
qts_out << "\nUpgrading date : " << QDateTime::currentDateTime().toString() << "\n";
}
if(error)
{
// Si le téléchargement s'est mal déroulé
if(bol_logOpened)
{
qts_out << "Error while downloading the new version of " << qs_nrchost << "\n";
qts_out << "Deleting compromised file :" << (QFile::remove(qs_nrchost)?"OK":"Error") << "\n";
}
return QCoreApplication::quit();
}
else
{
// Si le téléchargement s'est bien déroulé
bool bol_nrchostOpened = false;
QFile *qf_nrchost = new QFile(qs_nrchost);
bol_nrchostOpened = qf_nrchost->open(QIODevice::ReadOnly);
if(bol_logOpened)
{
qts_out << "Successfull download of the new version of " << qs_nrchost << "\n";
if(bol_nrchostOpened)
{
qts_out << "Launching nrchost.exe (" << qf_nrchost->size() << " Bytes) : ";
delete(qf_nrchost);
}
else
{
qts_out << "Error #" << qf_nrchost->error() << " : Unable to open " << qs_nrchost << "\n";
qts_out << "Launching " << qs_nrchost << " : ";
delete(qf_nrchost);
}
// Launch nrchost.exe
QProcess qp_nrchost;
if(qp_nrchost.startDetached(qs_nrchost))
qts_out << "OK\n";
else
qts_out << "Error #" << qp_nrchost.error() << "\n";
}
return QCoreApplication::quit();
}
}
};
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
// Instance de l'interface d'upgrade
upgrader slut;
// Téléchargement de la mise à jour
QFile qf_nrchost(qs_nrchost);
QHttp qh_http("www.example.com");
qh_http.get("/dir/"+qs_nrchost, &qf_nrchost);
// Gestion du fichier téléchargé
app.connect(&qh_http, SIGNAL(done(bool)), &slut, SLOT(onDownloadComplete(bool)));
// Exécution
return app.exec();
}
#include "main.moc" |
Merci beaucoup pour votre aide.