OVH Cloud OVH Cloud

Telecharger un fichier FACILEMENT en C++

34 réponses
Avatar
Jordan
Bonjour,
Je cherche un bout de code qui me permettrai de t=E9l=E9charger un fichier
en c++. La seul lib qui semblai simple est plut=F4t impossible a
installer, UrlMon. Il manque tout le temps un fichier, d'abord
msxml.h, apr=E8s log4cxx, relou.
Je code avec CodeBlocks une appli win32.
Merci d'avance.

10 réponses

1 2 3 4
Avatar
Jordan
On 26 juin, 00:42, Jordan wrote:
On 25 juin, 23:34, Christian ASTOR wrote:



> Jordan wrote:
> > Mon compilo me renvoi une erreur : `LPBINDSTATUSCALLBACK' has not bee n
> > 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 da ns
> 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 szS tatusText) = 0;

>          virtual HRESULT STDMETHODCALLTYPE OnStopBinding(
>              /* [in] */ HRESULT hresult,
>              /* [unique][in] */ __RPC__in_opt LPCWSTR szE rror) = 0;

>          virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetB indInfo(
>              /* [out] */ DWORD *grfBINDF,
>              /* [unique][out][in] */ BINDINFO *pbindinfo) = 0;

>          virtual /* [local] */ HRESULT STDMETHODCALLTYPE OnDa taAvailable(
>              /* [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 *p unk) = 0;

>      };

> typedef  __RPC_unique_pointer IBindStatusCallback *LPBINDSTATUSCALLBA CK;

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.
Avatar
Jordan
On 26 juin, 00:46, Jordan wrote:
On 26 juin, 00:42, Jordan wrote:



> On 25 juin, 23:34, Christian ASTOR wrote:

> > Jordan wrote:
> > > Mon compilo me renvoi une erreur : `LPBINDSTATUSCALLBACK' has not b een
> > > 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 s zStatusText) = 0;

> >          virtual HRESULT STDMETHODCALLTYPE OnStopBinding(
> >              /* [in] */ HRESULT hresult,
> >              /* [unique][in] */ __RPC__in_opt LPCWSTR s zError) = 0;

> >          virtual /* [local] */ HRESULT STDMETHODCALLTYPE Ge tBindInfo(
> >              /* [out] */ DWORD *grfBINDF,
> >              /* [unique][out][in] */ BINDINFO *pbindinf o) = 0;

> >          virtual /* [local] */ HRESULT STDMETHODCALLTYPE On DataAvailable(
> >              /* [in] */ DWORD grfBSCF,
> >              /* [in] */ DWORD dwSize,
> >              /* [in] */ FORMATETC *pformatetc,
> >              /* [in] */ STGMEDIUM *pstgmed) = 0;

> >          virtual HRESULT STDMETHODCALLTYPE OnObjectAvailabl e(
> >              /* [in] */ __RPC__in REFIID riid,
> >              /* [iid_is][in] */ __RPC__in_opt IUnknown *punk) = 0;

> >      };

> > typedef  __RPC_unique_pointer IBindStatusCallback *LPBINDSTATUSCALL BACK;

> 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?
Avatar
Christian ASTOR
Jordan wrote:

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.
Avatar
Jordan
On 26 juin, 07:56, Christian ASTOR wrote:
Jordan wrote:
> 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
referenced in function ___tmainCRTStartup
C'est surement lié a argv[]
Comment le résoudre?
Merci encore pour ta patience :D.
Avatar
Sylvain SF
Jordan a écrit :

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 :

int main(int argc, char* argv[]) { ... } Mais maintenant il me dit
error LNK2019: unresolved external symbol referenced in
function ___tmainCRTStartup C'est surement lié a argv[]



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.
Avatar
Jordan
On 26 juin, 12:05, Sylvain SF wrote:
Jordan a écrit :



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

> int main(int argc, char* argv[]) { ... } Mais maintenant il me dit
> error LNK2019: unresolved external symbol referenced in
> function ___tmainCRTStartup C'est surement lié a argv[]

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, e t
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 block s
(Ca serai vraiment vraiment cool)?
Merci d'avance.
Avatar
Steph
"Jordan" a écrit dans le message de news:


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...
Avatar
Jordan
Alors je me suis remis sur le truc, j'ai jamais utiliser visual
studio, j'ai un peu du mal.
J'ai le script suivant qui fonctionne :
#include <urlmon.h>
#include <windows.h>
#include <tchar.h>

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.
Avatar
Christian ASTOR
Jordan wrote:

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.
Avatar
Sylvain SF
Jordan a écrit :
Alors je me suis remis sur le truc, j'ai jamais utiliser visual
studio, j'ai un peu du mal.



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.
1 2 3 4