Le plus simple est avec URLDownloadToFile()
Oui c'est sur mais j'ai un gros probleme avec la librairie urlmon.
J'ai l'impression que cette librairie ne fonctionne pas avec Code
Blocks.
Help me !!!!
La lib, c'est urlmon.lib. Les includes plutôt ?
Donc soir tu mets à jour le SDK Windows, soit tu l'appelles
dynamiquement (pas besoin de lib ou include particulier dans ce cas).
Par exemple =>
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
typedef HRESULT (WINAPI* PUDTF)
( LPUNKNOWN caller,
LPCWSTR szURL,
LPCWSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK callback );
CoInitialize(NULL);
HINSTANCE hDLL = LoadLibrary(TEXT("urlmon.dll"));
if (hDLL)
{
PUDTF pURLDownload = (PUDTF)GetProcAddress(hDLL,
"URLDownloadToFileW");
if (pURLDownload != NULL)
{
HRESULT hr = pURLDownload(NULL, TEXT("http://portfolio.sudpresse.be/
main.php?g2_view=core.DownloadItem&g2_itemId=222378&g2"), TEXT("./
test.jpg"), 0, NULL );
if (SUCCEEDED(hr))
MessageBox(NULL, TEXT("File Downloaded"), TEXT("Information"),
MB_OK | MB_ICONINFORMATION);
}
FreeLibrary(hDLL);
}
return 0;
}
Mon compilo me renvoi une erreur : `LPBINDSTATUSCALLBACK' has not been
declared
Si �a peut aider, j'ai �crit un petit exe compil� avec AutoIt qui
t�l�charge un fichier depuis une URL. Fen�tre minimaliste avec juste une
barre de progression et un bouton "Stop" ; on passe en argument n� 1
l'URL et en n� 2 le nom du fichier sur disque. Inconv�nient : c'est un
programme externe, donc � g�rer comme tel. Avantage : �a marche. C'est
libre de droits. Tu peux r�cup�rer l'exe depuis
http://www.galaad.net/Download.exe et le code source AutoIt depuis
http://www.galaad.net/Download.au3
Merci mais je préfère quelque chose que je puisse mettre dans mon
code, c'est pour faire la mise a jour d'un logiciel.
Personne ne peu m'aider???
C'est pr�cis�ment � �a que �a me sert.
> Mon compilo me renvoi une erreur : `LPBINDSTATUSCALLBACK' has not been
> declared
C'est d�fini dans urlmon.h (ci-dessous)
Mettre � jour le SDK depuis MS et/ou changer de compilo...
Sinon, les autres m�thodes simples sont avec IHTMLDocument2, comme dans
la KB292485
ou par Wininet (InternetReadFile() ou FtpGetFile() par FTP)
MIDL_INTERFACE("79eac9c1-baf9-11ce-8c82-00aa004ba90b")
IBindStatusCallback : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE OnStartBinding(
/* [in] */ DWORD dwReserved,
/* [in] */ __RPC__in_opt IBinding *pib) = 0;
virtual HRESULT STDMETHODCALLTYPE GetPriority(
/* [out] */ __RPC__out LONG *pnPriority) = 0;
virtual HRESULT STDMETHODCALLTYPE OnLowResource(
/* [in] */ DWORD reserved) = 0;
virtual HRESULT STDMETHODCALLTYPE OnProgress(
/* [in] */ ULONG ulProgress,
/* [in] */ ULONG ulProgressMax,
/* [in] */ ULONG ulStatusCode,
/* [unique][in] */ __RPC__in_opt LPCWSTR szStatusText) = 0;
virtual HRESULT STDMETHODCALLTYPE OnStopBinding(
/* [in] */ HRESULT hresult,
/* [unique][in] */ __RPC__in_opt LPCWSTR szError) = 0;
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetBindInfo(
/* [out] */ DWORD *grfBINDF,
/* [unique][out][in] */ BINDINFO *pbindinfo) = 0;
virtual /* [local] */ HRESULT STDMETHODCALLTYPE OnDataAvailable(
/* [in] */ DWORD grfBSCF,
/* [in] */ DWORD dwSize,
/* [in] */ FORMATETC *pformatetc,
/* [in] */ STGMEDIUM *pstgmed) = 0;
virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(
/* [in] */ __RPC__in REFIID riid,
/* [iid_is][in] */ __RPC__in_opt IUnknown *punk) = 0;
};
typedef __RPC_unique_pointer IBindStatusCallback *LPBINDSTATUSCALLBACK;
J'ai essayé avec DEV C++, rien ne marche c'est encore pire que code
clocks, j'ai essayé visual studio 2008, il arrive a compiler mais le
programme ne fait rien.
Erreur de ma par, avec visual studio ca fonctionne.
Sinon pas possible de faire plus court sous visual studio vu que la
lib urlmon marche?
> Sinon pas possible de faire plus court sous visual studio vu que la
> lib urlmon marche?
Tu appelles juste :
CoInitialize(NULL);
suivi de
URLDownloadToFile(...)
en ajoutant au d�but :
#include <urlmon.h>
#pragma comment(lib, "Urlmon")
C'est tout.
Merci de ta patience, mais j'ai un dernier problème (qui n'en étai pas
un sous code blocks :D) , j'ai fait ceci :
#include <urlmon.h>
int main(int argc, char* argv[])
{
CoInitialize(NULL);
URLDownloadToFile (NULL, LPCWSTR(argv[1]), LPCWSTR(argv[2]), 0,
NULL );
return 0;
}
Mais maintenant il me dit error LNK2019: unresolved external symbol
_WinMain@16 referenced in function ___tmainCRTStartup
C'est surement lié a argv[]
Comment le résoudre?
Merci encore pour ta patience :D.
ou c'est li� � l'absence de _WInMain (comme indiqu�).
> Comment le r�soudre?
selon ton post du 25/06 @ 20:55, tu utilisais:
>> int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
tu connais donc la r�ponse.
SF.
Avec ceci de nouvelles erreurs apparaissent.
Bon je résume.
Je cherche a faire un truc qui télécharge un fichier.
J'ai essayer pendant 3 jours tout ce que j'ai pu trouver sur internet
mais a chaque foie une erreur apparait ou un problème ce pose comme
par exemple absence de lib ou erreur dans la lib ou impossible de
récupérer les paramètres mis a l'exécutable ou erreur de syntaxe, et
j'en passe.
Donc on vas faire comme si rien n'a été écrit au dessus.
Est -t-il possible de faire un logiciel fantôme qui télécharge le
fichier spécifié en paramètre? Si oui est ce possible avec code blocks
(Ca serai vraiment vraiment cool)?
Merci d'avance.
> Avec ceci de nouvelles erreurs apparaissent.
Quelles erreurs ?
C'est ce qui soi-disant marchait au-dessus, et tu as chang� le WinMain en
main (GUI et Console, c'est pas pareil)
>Donc on vas faire comme si rien n'a �t� �crit au dessus.
>Est -t-il possible de faire un logiciel fant�me qui t�l�charge le
>fichier sp�cifi� en param�tre?
Le code qu'on t'a donn� marche parfaitement, sur toutes les versions de
Visual Studio depuis des ann�es.
Mais si tu ne configures pas ton IDE comme il faut et ne mets pas � jour ton
environnement de D�v (SDK surtout), rien ne marchera comme voulu...
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CoInitialize(NULL);
URLDownloadToFile (NULL, TEXT("http://monurl/fichier.ext"), TEXT
("destination.ext"), 0, NULL );
return 0;
}
Maintenant j'aimerai a la place de TEXT("http://monurl/fichier.ext")
et TEXT("destination.ext") mettre quelque chose qui prendrai en compte
les paramètres passé au programme. Jusqu'à maintenant je faisais ca
avec argv mais la il semblerai que ce soit différent, je ne comprend
pas du tout ceci : int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
J'ai toujours fait int main(int argc, char* argv[])
Merci d'avance.
yaka utiliser autre chose.
> J'ai le script suivant qui fonctionne :
c'est un source ou un programme, pas un scipt.
> quelque chose qui prendrai en compte
> les param�tres pass� au programme. Jusqu'� maintenant je faisais ca
> avec argv mais la il semblerai que ce soit diff�rent, je ne comprend
> pas du tout ceci : [..] _tWinMain vs main
tu n'aurais oubli� de le dire plus t�t ??
le point d'entr� d'un programme *avec GUI* (avec _fen�tre_)
est _tWinMain, de tels programmes ne recoivent pas de param�tres
ligne de commande puisqu'ils n'interagissent pas avec une console
(mais uniquement leur _fen�tre_).
les programmes mode console utilisent le point d'entr�e main et
re�oivent les param�tres de la ligne de commande.
il convient donc simplement de choisir au d�part (lorsque l'on
cr�� le project) le bon mod�le, Studio cr�era le bon point d'entr�e.
�videmment choisir de cr�er une appli. console pour y coller
un WinMain ou une appli. window pour y coller un main est juste
une fa�on (un peu st�rile) de perdre son temps.
Sylvain.
Par exemple =>
TCHAR sArg[260];
lstrcpy(sArg, __argv[1]);
URLDownloadToFile (NULL, sArg, TEXT("destination.ext"), 0, NULL );
Si c'est possible comment, car la pour l'instant il y a pas une
personne qui me parle de la même chose, et pour l'instant rien ne
marche.
Donc déjà si je veux quelque chose fantôme, que on ne voix pas de
fenêtre, il faut créer un projet console fenêtre ou autre chose?
En suite, en fonction de ca quel sera le prototype de la fonction
principal, int main, int winmain, autre chose, avec en paramètre quoi,
char* argv[], autre chose?
Après, dans l'instruction URLDownloadToFile je met quoi, argv[x], TEXT
(argv[x]), autre chose?
Merci d'avance.
S'il vous plait, vraiment besoin d'aide...
> S'il vous plait, vraiment besoin d'aide...
Ben comme je t'ai dit au-dessus (__argv[1] sous Visual)
(CommandLineToArgvW() �galement)
J'ai essayé avec CommandLineToArgvW(), j'obtiens un warning a la
compilation et un jolie plantage a l'exécution. Voila le warning :
uninitialized local variable 'argv' used
Et voila le code :
#include "stdafx.h"
#include <urlmon.h>
int _tmain()
{
LPCWSTR *argv;
CommandLineToArgvW(*argv, NULL);
CoInitialize(NULL);
URLDownloadToFile (NULL, argv[1], TEXT("test.jpg"), 0, NULL );
return 0;
}
> int _tmain()
> {
> LPCWSTR *argv;
> CommandLineToArgvW(*argv, NULL);
Avec ce code, heureusement que �a plante !
J'ai l'impression que tu programmes au pifom�tre...
Par ex =>
// On obtient les arguments dans le tableau pArgv
int nNbArgs;
LPWSTR* pArgv = CommandLineToArgvW(GetCommandLineW(), &nNbArgs);
Mais A2W est inconnu, normal sinon c'est pas drolle :D. Un .h doit
surement être inclue, mais je ne sais pas encore le quel.
return 0;
}
Oulala c'est dur, je me sens trop blazé d'avoir passé 4 jours a
trouver ca. On est loin des 20ene de ligne des codes du début.
Voila. @+ pour de nouvelles aventures...
> et a partir de la on est en mesure d'�crire un programme qui marche, soit :
> int main()
> {
> URLDownloadToFileA (NULL, __argv[1], __argv[2], 0, NULL);
> return 0;
> }
Tout est faux.
Mais si tu ne lis pas les r�ponses...
Tu n'as rien r�ussi : � partir d'un bon code tu en es arriv� � un code tout
pourri :-)
Apparemment, tu n'as pas compris la diff�rence entre Unicode et Ansi et
comment configurer l'IDE.
Oulala pardon j'ai fait plain d'erreur la, j'ai pas vu la 2eme page,
et je travaillai dans un projet consol, pffff...
> J'ai l'impression que tu programmes au pifom tre...
C'est un peu ca, je suis un peu perdu...
> Tout est faux.
Vrais :D
Par ex =>
> // On obtient les arguments dans le tableau pArgv
> int nNbArgs;
> LPWSTR* pArgv = CommandLineToArgvW(GetCommandLineW(), &nNbArgs);
Pour CommandLineToArgvW() il n'y a pas quelque chose a déclarer avan
ou un .h a appeler? Le compilo me dit identifier not found.
J'ai fait ceci :
#include "stdafx.h"
#include <urlmon.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
int nNbArgs;
LPWSTR* pArgv = CommandLineToArgvW(GetCommandLineW(), &nNbArgs);
URLDownloadToFile(NULL, pArgv[1], pArgv[2], 0, NULL);
return 0;
}
> Pour CommandLineToArgvW() il n'y a pas quelque chose a d�clarer avan
> ou un .h a appeler? Le compilo me dit identifier not found.
C'est toujours dans la doc :
http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx
Mais __argv[1] est bon aussi.
Ce qui ne se fait normalement pas est d'appeler en dur la version Ansi
URLDownloadToFileA()
Et tu as enlev� CoInitialize(), qui est n�cessaire pour ne pas que cela
plante sur certains environnements.
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int nParam;
LPWSTR* pArgv = CommandLineToArgvW(GetCommandLineW(),&nParam);
CoInitialize(NULL);
URLDownloadToFile(NULL, pArgv[1], pArgv[2], 0, NULL);
return 0;
}
@+
non �a peut gravement planter.
> int nParam;
> LPWSTR* pArgv = CommandLineToArgvW(GetCommandLineW(),&nParam);
tu penses que 'nParam' est l� pour faire joli ou devrait
servir � quelque chose ?
SF.