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éé :
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 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.