YOYODOWN - TÉLÉCHARGEMENT HTTP [DEV-C++ 4.9.9.2]

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 17 févr. 2007 à 18:04
gf18 Messages postés 11 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 9 juillet 2008 - 23 juil. 2008 à 13:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41518-yoyodown-telechargement-http-dev-c-4-9-9-2

gf18 Messages postés 11 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 9 juillet 2008
23 juil. 2008 à 13:15
Je ne suis pas un spécialiste en API win32, mais

case SC_CLOSE:
ShowWindow(frmhWnd, SW_HIDE);
return 0;
break;
case SC_MINIMIZE:
ShowWindow(frmhWnd, SW_MINIMIZE);
return 0;
break;
case SC_MAXIMIZE:
ShowWindow(frmhWnd, SW_MAXIMIZE);
return 0;
break;
case SC_RESTORE:
ShowWindow(frmhWnd, SW_RESTORE);
return 0;


Est-ce vraiment nécessaire?
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
28 déc. 2007 à 12:07
Merci ;)

Remplacer PROGRESS_CLASS dans les arguments de CreateWindowEx par "msctls_progress" n'a pas suffit, bizarrement, il a fallut le remplacer par "msctls_progress32"..

Je ne sais pas si ca va géner pour la suite

a+ !
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
28 déc. 2007 à 11:49
Regarde ici :
http://msdn2.microsoft.com/en-us/library/ms697647.aspx

Extrait :
"The window class name for a progress bar control is PROGRESS_CLASS, which is defined as "msctls_progress" in Commctrl.h."

Le site de la MSDN est particulièrement pratique pour se genre de chose. Pense à le mettre en favori ;)

YOYO, @+.
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
28 déc. 2007 à 11:27
Il semble que non d'après les tutos que j'ai lus.

Tous parlent d'utiliser "Common control library" (comctrl32.dll) et de modifier le fichier de ressources, mais je ne trouve pas comment faire sans fichier de ressources.

C'est d'autant plus incompréhensible que je ne vois aucune trace de telles manip dans ton code.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
28 déc. 2007 à 11:22
Bonjour shuttleur.

Je n'en suis pas certain mais il me semble que la classe est définie dans windows.h. En fait c'est un define de windows, du win32.

YOYO, @+.
shuttleur Messages postés 33 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 30 juin 2008
28 déc. 2007 à 11:11
Bonjour YOYO269

Je m'intéresse beaucoup à ton projet, surtout pour apprendre la création de fenêtres sous Windows, il reste un truc que j'ai pas compris (oui bon enfin disons un :) ) :

- où est définie la classe PROGRESS_CLASS pour créer ta progressbar ?

Merci d'avance
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
17 déc. 2007 à 20:47
Merci hijakhakker.
En fait avec ce mode (que je ne connais pas :p) on doit pas pouvoir utiliser une barre de progression.
Mais c'est une idée.

YOYO, @+.
hijakhakker Messages postés 7 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 17 décembre 2007
17 déc. 2007 à 19:56
salut yoyo
ton programme m'est tres utile et je trouve que son importance didactitiel est enorme
je me demande pourquoi tu n'a pas inclue un mode de reception pour le Chunked Transfer-Encoding qui permettera de recevoir le fichier sans savoir la taille auparavent mais recevoir des paquet ou partie terminé par crlf?
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2007 à 19:04
Space_Monkey Messages postés 16 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 2 septembre 2007
25 févr. 2007 à 22:01
Très clair! Merci beaucoup pour cette aide ;-) En espérant que ca servira à d'autres.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
25 févr. 2007 à 21:57
Alors là Space_monkey, il faut étudier le protocole HTTP.
Voilà une page qui devrait t'aider :
http://www.commentcamarche.net/internet/http.php3

En fait quand tu envoies une requête HTTP (GET http://balbla.fr/blabla etc...), la réponse que tu reçois contient un code à 3 chiffres (voir lien donné).
Et c'est avec ce code que tu sais à quoi tu as affaire (redirection : 30x).
Les codes ne sont pas parfaitement gérés dans mon programme, mais tu en vois un exemple.
Et dans le cas d'une redirection, l'entête de la réponse contient un champ "Location: ", qui te donne la nouvelle URL avec laquelle tu dois effectuer une nouvelle requête.

J'espère avoir été assez clair ! ;)

YOYO, @+.
Space_Monkey Messages postés 16 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 2 septembre 2007
25 févr. 2007 à 21:12
Désolé j'ai pas été très explicite.. Voici le contenu de la mise à jour. J'ai laisser que les comentaires, sauf la condition du if et le goto qui d'après moi sont importants à signaler pour bien comprendre.

// On vérifie s'il y a une redirection
if(Tmp[0] == '3' && Tmp[1] == '0' && (Tmp[2] == '1' || Tmp[2] == '2'))
{
// On ferme la connexion actuelle
// on récupère la nouvelle URL
// On modifie l'URL affichée
goto Reconnexion;
}

Ensuite j'ai plusieurs questions à poser:
- Je ne comprend pas ton test, comment peux tu en déduire qu'il s'agit d'une redirection?
- Cette question est en lien étroit avec la premiere: Quelle est la différence (au niveau html) entre une url simple et une url avec redirection?
-Les pages générées lors des redirections sont elles standard et te bases tu là dessus pour effectuer ton test?

Je ne penses pas qu'il faille répondre à chaque question indépendament. J'ai bien fait une recherche sur le sujet mais à chaque fois j'en revient à la meme question: Pourquoi ton test semble-t-il simple alors que les méthodes de redirections sont variées? (avec Apache, en html, en php, ...)
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
25 févr. 2007 à 20:40
Ben c'est dans le code source Space_Monkey !
Il y a un commentaire qui dit quelque chose de ce genre : "// Vérification s'il y a redirection"
Je ne vois pas très bien ce que tu veux dire. :(

YOYO, @+.
Space_Monkey Messages postés 16 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 2 septembre 2007
25 févr. 2007 à 20:12
Heuu si c'est pas trop demander, on pourrait avoir le contenu de cette modification concernant les redirections? ^^
Merci d'avance Yoyo!
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
25 févr. 2007 à 14:18
Nouvelle mise à jour !
Prise en charge des URL redirigées.
Merci à toi Deck_bsd pour m'avoir dégoter des URL avec lesquelles ça foirait.
Hésite pas à en chercher d'autres ! ;)

YOYO, @+.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
23 févr. 2007 à 18:23
J'ai hâte de voir ça !
Bon sang, qu'est-ce qu'il va me sortir encore ??? LOL :D

YOYO, @+.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 févr. 2007 à 16:18
Bien joué yoyo :D


Ne te tracasse pas pour cela, j'en ai encore un je pense :D Mais je ne suis pas chez moi donc je te dirai ça ce soir ou demain.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
23 févr. 2007 à 14:56
Mise à jour faite !

Deck_bsd > Ca y est le problème semble corrigé. En fait, avant j'utilisais des requêtes HTTP 1.0 et visiblement en utilisant des requêtes HTTP 1.1, ça passe ! ;)
Hésite pas à tester encore et encore pour trouver autre chose qui cloche. :p

Dr_progz > Merci pour les infos d'adaption, mais je laisse à chacun le soin d'adapter à ça guise. En tous cas, ils sauront où regarder pour pouvoir compiler sur VC++. ;)
Dans cette mise à jour, j'ai également modifié la fonction ModifURL(), dont tu avais parlé.
Je l'avais codée comme un barbare, façon brute de décoffrage. lol
En prenant ta méthode (et en corrigeant une petite erreur pas méchante), je l'ai incluse dans le code.

YOYO, @+.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
23 févr. 2007 à 12:52
Si tu veux apprendre, cherche des tutoriaux en C et procure toi un bouquin de C. C'est le mieux.
Un conseil ne grille pas les étapes en voulant apprendre trop vite.
Je sais c'est frustrant, mais si par exemple tu n'arrives pas à maitriser le principe de boucle et de condition ou encore bien différencier les différents types de variables, ça va être (TRES) difficile pour le reste, voire impossible.

YOYO, @+.
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
23 févr. 2007 à 12:48
Desole yoyo269!
mon but etait apprendre jsutement.

merci
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
23 févr. 2007 à 12:44
Désolé Sterkasor mais faut pas abuser.
Si tu ne vois pas comment faire ce que tu me demandes, faut sincèrement penser à apprendre le C et à faire des recherches.

Sinon deck_bsd, c'est pas un cadeau que tu m'as fait avec ton URL ! :p
Le serveur me répond en disant que le fichier est temporairement déplacé et donc je récupère la nouvelle URL qu'il me fournit, me reconnecte à cette nouvelle URL et envoie la requête.
A chaque fois, il me dit que le fichier a temporairement changé d'URL.
Je continue à chercher. Je sens que je vais apprendre des trucs. ;)

YOYO, @+.
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
23 févr. 2007 à 12:23
Sans demander au utilisateurs comment on peut lancer le fichier telecharger? et fermer l'appli a la fin de telechargement?
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
22 févr. 2007 à 19:07
Ah super ça Deck_bsd !
Je regarde ça de plus près et je vous tiens au courant.
je pense pas que ça soit bien méchant. ;)

YOYO, @+.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
22 févr. 2007 à 19:00
re yoyo , juste pour signaler que avec un lien de ce type :

http://www.atlence.com/calculre/[atlence]_code_des_couleurs_des_resistances.pdf

le programme me met URL invalide.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
21 févr. 2007 à 16:09
okidoki yoyo, merci pour ton explication :D
Dr_Progz Messages postés 16 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 21 février 2007
21 févr. 2007 à 14:38
J'ai essayer de compiler ton programme sous Visual C++ 6, mais cela ne marche pas, je te donne des modification a faire pour rendre ton programme compatible DevC++ et MSVC :

- Dans le fichier 'Fichiers_Dossiers.h' : ajoute en haut
#ifndef INVALID_FILE_ATTRIBUTES
#define INVALID_FILE_ATTRIBUTES (DWORD (-1))
#endif
#ifndef BIF_NEWDIALOGSTYLE
#define BIF_NEWDIALOGSTYLE 0x0040
#endif

- Dans le fichier 'YoyoDown.h' : dans la fonction 'FenetreProc' : dans la 'case WM_CTLCOLORSTATIC' : retire la declaration de i de la for, tu met int i; for....

en fin pour le linker utiliser la lib 'ws2_32.lib'

Comme ca le programme sera compilable sous MSVC et Dev.

Autre chose : La fonction 'ModifURL' est mal codée :

char *ptr = URL;
while (*ptr)
{
char c = get_stand_char(*ptr);
if (c != -1)
{
*ptr = c;
ptr++;

char *ptr2 = ptr;
while(*(ptr2 + 2))
{
*ptr2 = *(ptr2 + 2);
ptr2++;
}
*ptr2 = 0;
}
else
ptr++;
}

char get_stand_char(char* s)
{
switch (*s)
{
case '%0':
switch (*(s+1))
{
case '9': return ('\t');
.
.
.
}
break;
.
.
}

return (-1);
}
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
21 févr. 2007 à 11:19
Merci Gamemonde !
Effectivement il y a bcp de .h et peu de .cpp.
C'est une mauvaise habitude que j'ai prise, et que je suis en train d'essayer de modifier.
Donc évitez de prendre exemple sur cette 'technique'.
En effet, cette source est (je pense) une bonne base pour pouvoir faire de nombreuses choses, diverses et variées (gestionnaire de téléchargements, fonction de mise à jour, ...).
En ce moment, j'essaie d'ajouter le téléchargement par FTP, mais c'est beaucoup plus complexe.
Ce que j'ai fait, pour l'instant, marche, mais sur une patte. ;-)
A suivre...

YOYO, @+.
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
21 févr. 2007 à 01:55
Tres bonne source code mais je ne vois que des fichiers h et un fichier cpp

Très interessent cela permet de faire beaucoup de chose un update menager...


salut
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
19 févr. 2007 à 00:28
Merci YoYo269,
c'est parfait! exactement comme je cherchais :)


@+
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
18 févr. 2007 à 23:09
Merci yann_lo_sann, c'est sympa ! ;)
Sterkasor > Le CloseHandle(), pour le trouver fais une recherche il est dans le code source mis à jour.
Si tu parles d'ouvrir le fichier à la fin du téléchargement, cela est proposé dans le code mis à jour.
Enfin pour enlever la zone de texte où tu rentres l'URL, regarde du côté de la fonction CreerInterface().

YOYO, @+.
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
18 févr. 2007 à 18:38
Bonne source ! je te mets 8/10.
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
18 févr. 2007 à 16:04
CloseHandle() doit etre placer ou exactement?
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
18 févr. 2007 à 15:14
Re,
je n'ai toujours pas reussi a lancer le telecharge a la fin de telechargement :=(
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
18 févr. 2007 à 14:58
Salut YOYO269
merci j'ai essaye cela fonction bien!
j'utilise Dev-C++ je ne sais pas comment supprimer la zone d'url?
que je dois faire pour cela?

merci
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
18 févr. 2007 à 13:02
Salut deck_bsd et merci ! ;)
Le atoi64 c'est au cas où le fichier fait plus de 4 Go. C'est rare, c'est vrai, mais une image DVD dépasse cette valeur.
Donc ce n'est pas codé en 64 bits, mais certaines variables gérant la taille du fichier sont codées sur 64 bits.
Du coup avant de dépasser la valeur max d'un entier de 64 bits...les poules auront des dents !!!

YOYO, @+.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 févr. 2007 à 12:27
Bonne source yoyo :) comme toujours, Tu es en 64 bits? car si tu ne l'es pas, je comprend pas trop alors l'utilisation d'un atoi64 par rapport à l'utilisation d'un atoi standart ?


++ Yoyo
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
18 févr. 2007 à 11:35
Source modifiée !
Sterkasor, si tu veux fixer l'url du fichier, fixe la valeur de la variable qui corresponde à l'url.
Tu n'as qu'à remplacer ceci :
strcpy(Chemin, PrendreTexte(TextBoxhWnd[1]));
par cela :
strcpy(Chemin, "http://serveur/dossier/sous-dossier/nom_fichier.ext");

Pour l'ouverture du programme, j'ai modifié la source pour que l'ouverture soit proposée à l'utilisateur.

YOYO, @+.
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
18 févr. 2007 à 11:22
et lancer automatiquement le fichier telecharger a la fin de telechargement.
meme si c'est possible fermer le ton prog?
cs_sterkasor Messages postés 53 Date d'inscription dimanche 25 janvier 2004 Statut Membre Dernière intervention 11 juin 2007
18 févr. 2007 à 11:20
je veux cacher par exemple le url de telechargement pour mettre url d'un fichier sur mon site qui sera fix (on pourra pas changer url de fichier), ou je dois modifier?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 févr. 2007 à 21:24
C'est viable en sortie de thread.
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
17 févr. 2007 à 18:13
Bien non !
Où me conseillerais-tu de mettre le CloseHandle ?
J'ai pensé à la fin du thread (juste avant le return 0;), mais j'ai un gros doute. :(

YOYO, @+.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
17 févr. 2007 à 18:04
Tu ne ferme pas hTelechargement avec CloseHandle?
Rejoignez-nous