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éé :
Voici mon code :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
Code C++/Qt4 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager