Toon posts:

[C++]URLDownloadToFile

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Zoals gebleken uit eerdere threads probeer ik een bestand van een server op te halen. Nu mag de functie URLDownloadToFile niet blocken als ik dat doe.

Ik kom er maar niet uit, heb gezocht op het internet maar ik snap niet waarom OnProgress maar niet wordt aangereoepen. De code hieronder is enkel een test, ik wil het later toepassen in een Win32 applicatie.

Waarom wordt OnProgress niet aangeroepen?

C++:
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
#include <iostream>
#include <windows.h>
using namespace std;

class CallbackDownload: public IBindStatusCallback {
public:
    HRESULT STDMETHODCALLTYPE OnStartBindingGetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo);
    HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority);
    HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo);
    HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD  grfBSCF, DWORD  dwSize, FORMATETC *pfmtetc, STGMEDIUM *pstgmed);
    HRESULT STDMETHODCALLTYPE OnLowResource(DWORD  dwReserved);
    HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID  riid, IUnknown *punk);
    HRESULT STDMETHODCALLTYPE OnProgress(ULONG  ulProgress, ULONG  ulProgressMax, ULONG  ulStatusCode, LPCWSTR  szStatusText);
    HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD  dwReserved, IBinding *pbinding);
    HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT  hrStatus, LPCWSTR  szStatusText);
private:
};

int main() {
    CallbackDownload *downloadFile = NULL;
    URLDownloadToFile(NULL, "http://home.planet.nl/~ever0225/petersRPG.bmp", "test.bmp", 0, downloadFile);
    return 0;
}
/**
 * CALLBACK GEDEELTE VOOR URLDownloadToFile.
 */
HRESULT STDMETHODCALLTYPE CallbackDownload::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::GetPriority(LONG *pnPriority) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnDataAvailable(DWORD  grfBSCF, DWORD  dwSize, FORMATETC *pfmtetc, STGMEDIUM *pstgmed) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnLowResource(DWORD  dwReserved) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnObjectAvailable(REFIID  riid, IUnknown *punk) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnProgress(ULONG  ulProgress, ULONG  ulProgressMax, ULONG  ulStatusCode, LPCWSTR  szStatusText) {
    MessageBox(NULL, "OnProgress aangeroepen!", "Informatie", MB_OK);
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnStartBinding(DWORD  dwReserved, IBinding *pbinding) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnStopBinding(HRESULT  hrStatus, LPCWSTR  szStatusText) {
    return S_OK;
}

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 10-02 15:26
C++:
1
 CallbackDownload *downloadFile = NULL;


noem mij gek, maar misschien komt het hier door?

hallo


Verwijderd

Topicstarter
Hoe moet ik het dan voor elkaar krijgen? Ik kan geen instantie van die klasse maken omdat de klasse abstract is. Ik heb namelijk geen idee hoe ik dan ervoor moet zorgen dat ::OnProgress wordt aangeroepen, een NULL-pointer gaat niet werken dat weet ik... maar voorkomt in elk geval een crash.

Verwijderd

Topicstarter
Jaj, gelukt. Ik ben best dom bezig, vergeten de laatste drie virtuele functies te overloaden:

C++:
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
#include <iostream>
#include <windows.h>
using namespace std;

class CallbackDownload: public IBindStatusCallback {
public:
    HRESULT STDMETHODCALLTYPE QueryInterface( 
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
    ULONG STDMETHODCALLTYPE AddRef( void);
    ULONG STDMETHODCALLTYPE Release( void);

    HRESULT STDMETHODCALLTYPE OnStartBindingGetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo);
    HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority);
    HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo);
    HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD  grfBSCF, DWORD  dwSize, FORMATETC *pfmtetc, STGMEDIUM *pstgmed);
    HRESULT STDMETHODCALLTYPE OnLowResource(DWORD  dwReserved);
    HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID  riid, IUnknown *punk);
    HRESULT STDMETHODCALLTYPE OnProgress(ULONG  ulProgress, ULONG  ulProgressMax, ULONG  ulStatusCode, LPCWSTR  szStatusText);
    HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD  dwReserved, IBinding *pbinding);
    HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT  hrStatus, LPCWSTR  szStatusText);
private:
};

int main() {
    CallbackDownload downloadFile;
    URLDownloadToFile(NULL, "http://home.planet.nl/~ever0225/petersRPG.bmp", "test.bmp", 0, &downloadFile);
    return 0;
}
/**
 * CALLBACK GEDEELTE VOOR URLDownloadToFile.
 */
HRESULT STDMETHODCALLTYPE CallbackDownload::QueryInterface( 
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject) {
            return S_OK;
}
ULONG STDMETHODCALLTYPE CallbackDownload::AddRef( void) {
    return S_OK;
}
ULONG STDMETHODCALLTYPE CallbackDownload::Release( void) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindinfo) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::GetPriority(LONG *pnPriority) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnDataAvailable(DWORD  grfBSCF, DWORD  dwSize, FORMATETC *pfmtetc, STGMEDIUM *pstgmed) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnLowResource(DWORD  dwReserved) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnObjectAvailable(REFIID  riid, IUnknown *punk) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnProgress(ULONG  ulProgress, ULONG  ulProgressMax, ULONG  ulStatusCode, LPCWSTR  szStatusText) {
    MessageBox(NULL, "OnProgress aangeroepen!", "Informatie", MB_OK);
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnStartBinding(DWORD  dwReserved, IBinding *pbinding) {
    return S_OK;
}
HRESULT STDMETHODCALLTYPE CallbackDownload::OnStopBinding(HRESULT  hrStatus, LPCWSTR  szStatusText) {
    return S_OK;
}

[ Voor 2% gewijzigd door Creepy op 20-07-2006 00:11 . Reden: code tag aangepast voor kleurtjes ;) ]


Verwijderd

Topicstarter
Stuit ik meteen tegen een volgend probleem aan. Ik moet een PHP pagina ophalen waar variabelen aan meegegeven zijn:

Bijvoorbeeld:
http://www.google.nl/sear...&btnG=Google+zoeken&meta=

URLDownloadToFile accepteert dit niet, kan ik dan toch op de een of andere manier de pagina downloaden via deze functie. Of zou ik dat met sockets moeten doen...

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Hoezo niet - die variabelen staan toch gewoon in de URL?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Je zat aan het begin inderdaad fout met die eerste drie functies, stond ook in de Platform SDK dattie inherit van IUnknown ;)
Valt me mee dat het je zo gelukt is, aangezien ik je nergens "new" zie aanroepen in die code :S
Ik zou als ik jou was zoieso eens het boek "Essential COM" door Don Box eens lezen, dan snap je het ineen keer veel beter ;)

Overigens klopt je code nog steeds niet, na de URLDownloadToFile eindigd je functie, dus wordt die callback weggegooid, en dan werkt je hele callback mechanisme dus niet meer ;) Oplossing: dat boek lezen :P
(snelle oplossing: new CallbackDinges(); doen, en met AddRef en Release bijhouden wanneer het object weggedonderd mag worden ;) )

Wat betreft GET en POST vars, en blocking en al die zooi, kijk eens naar InternetOpen, InternetOpenUrl, en InternetReadFile, die zijn een stuk flexibeler (en dan hoef je ook niet eerst naar een file te schrijven)

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


Verwijderd

Topicstarter
Thanks, zal er eens naar gaan kijken. Ik dacht dat m'n code wel klopte... de functie URLDownloadToFile blijft namelijk hangen zolang er nog data moet worden opgehaald. In de tussentijd wordt OnProgess meerdere malen aangeroepen en de m'n object wordt pas weggeflikkerd als hij de functie verlaat.

Hoe dacht jij dan dat het moest? Ik zal trouwens de functies die jij aangaf doorspitten en kijken of ik die kan gebruiken :).
Pagina: 1