[C/WIN32] TÉLÉCHARGEMENT DE FICHIER AVEC API SEULEMENT.

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 18 avril 2007 à 21:08
LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009 - 23 avril 2007 à 11:37
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/42332-c-win32-telechargement-de-fichier-avec-api-seulement

LeFauve42 Messages postés 239 Date d'inscription vendredi 20 octobre 2006 Statut Membre Dernière intervention 20 avril 2009
23 avril 2007 à 11:37
Salut,

Je suis peut-etre hors sujet ou je n'ai pas compris l'interet, mais j'ai toujours fait ca avec les api urlmon, et ca a l'air beaucoup plus simple.
Un exemple de prog (vite fait) qui prend en argument une url a telecharger et un nom de fichier pour sauver le contenu:

#include "stdafx.h"
#include

int main(int argc, char* argv[])
{
if(argc<3) return 1;

LPCSTR url = argv[1];
LPCSTR file = argv[2];
HRESULT hR = URLDownloadToFile(NULL,url,file,0,NULL);
if(!SUCCEEDED(hR)) return 1;
return 0;
}

Eric
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 avril 2007 à 21:10
J'avais pas testé l'exécutable :P
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
19 avril 2007 à 19:27
Ce qui est marrant avec SAKingdom, c'est que le truc qui sert a rien et qui fait perdre 1 milliardième de seconde au cpu, il le repère tout de suite, alors que le fait que le prog prenne 60 mo de mémoire et qu'il consomme en permanence 10-20% de cpu pendant le download d'un fichier de 50 mo, ça le choque même pas.

Plus serieusement, le HeapAlloc() de la taille du fichier, je pense que ca fait un peu lourd. Et aussi, le bouton download reste disponible lors d'un download, ce qui fait qu'on peut lancer plusieurs fois le même download.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 avril 2007 à 19:02
Oui c'est ce que je me suis dit aussi, je vien de re vérifier et en faite ce que je croyai être des caractères en trop sont en faites des caractères non imprimable qui dans le notepad prête à confusion.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 avril 2007 à 17:39
Tu obtenais des caractère en trop ? Ça ne devrait techniquement pas arriver.
Et puis d'ailleurs, WriteFile n'écrira pas le 0 de fin de chaine car tu lui dis d'écrire dwBytesRequired octet alors que le 0 se situe un octet plus loin. Étant donné que seul WriteFile utilise la chaine et qu'il ne prend même pas en compte de 0 de fin de chaine, on devrait pouvoir sans passer sans problèmes.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 avril 2007 à 15:53
ben j'ai remarqué que si je ne mettait pas le zéro de fin de chaîne j'obtenais des caractères en trop. Et pour httpQueryInfo j'avai fait un test de valeur, la fonction renvoie 1 ou 0 mais elle renvoyai tout le temps 0 hors elle fonctionne très bien (sinon on aurai pas la taille du fichier) et cela forcément faisait planter le programme. Tu vas me dire que c'est bizzar, mais pourtant ... En ce qui concerne dwSizeOfByReq, c'est vrai, je vai le faire.
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
18 avril 2007 à 21:08
Dans la fonction DownloadFile, à quoi te sert de mettre le 0 de fin de chaine à szBuff si elle est stocké directement dans un fichier ?

Aussi, dwSizeOfByReq pourrait être une macro plutôt qu'une variable vue qu'il n'est pas modifié.

Tu ne test pas non plus la valeur de retour de HttpQueryInfo. J'ai lus dans le MSDN qu'elle pouvait renvoyer une erreur si, par exemple, il n'y a pas assez de mémoire pour le buffer etc.