URLDownloadToFile



  • Hi, ich habe eine Konsolenanwendung geschrieben, die eine Datei aus dem Internet downloaden soll.
    Ich habe auch schon den richtigen Befel gefunden: URLDownloadToFile

    Das Problem dabei ist nur, dass der Compiler meine Syntax nicht so ganz zu verstehen scheint^^.

    Hier mal der betreffende Ausschnitt aus meinem bisherigen Code:

    #include<iostream> 
    #include<windows.h> 
    #include<conio.h>
    using namespace std; 
    
    int main() 
    {
    	URLDownloadToFile(NULL,(LPCWSTR) "www.google.de",(LPCWSTR) "C://test.txt", NULL, NULL);
    }
    

    Daraus ergeben sich 2 Probleme:

    1.ich musste bei den Parametern 2 und 3 sowieso schon casten, da sonst die Fehlermeldung "Konvertierung des Parameters 2 con const char in LPCWSTR nicht möglich" kommt. Vielleicht werden diese Paramtere durch den Cast also schonmal falsch konvertiert.

    2.Es kommt noch immer eine Fehlermeldung:

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Da diese Syntax offensichtlich falsch ist, könnte mir beitte jemand ein richtiges Codebeispiel geben?

    Danke im Voraus,
    Andreas.



  • (LPCWSTR) "www.google.de" => L"www.google.de"

    ansonsten wäre das winapi-forum aber das richtige forum gewesen ;P

    btw: klar versteht er deine syntax net, weil es falsch ist - du kannst auch net einfach von nem int auf nen string casten -.-'



  • erstmal sorry für das falsche Forum, aber mit L"www.google.de" erhalte ich jetzt sogar 2 Fehler:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_URLDownloadToFileW@20" in Funktion "_main".

    und(wie vorher auch):

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Irgendwie scheint die Syntax noch immer falsch zu sein; am besten wäre natürlich ein funktionierendes Codebeispiel 🙂

    hier nochmal mein Code:

    #include<iostream> 
    #include<windows.h> 
    #include<conio.h>
    using namespace std; 
    
    int main() 
    {
    	URLDownloadToFile(NULL, L"www.google.de",L"C://test.txt", NULL, NULL);
    }
    

    Irgendetwas muss bei der Syntax immernoch falsch sein.



  • http://msdn.microsoft.com/en-us/library/ms836094.aspx

    MSDN schrieb:

    Header: urlmon.h
    Library: urlmon.lib

    was sagt uns das?
    evtl, dass du nich nur nen header brauchst sondern auch ne lib mitlinken musst?

    bb



  • du musst eine urlmon.lib Datei unter ProjectSettings->Linker->Input->Additional Dependencies einfügen

    PS: toll beide gelichzeitig geposted xD





  • ololo das sind immer die besten ololo



  • so, ich habe jetzt das header und die lib included und die korrekte Konvertierung übernommen;

    gut, jetzt bringt der Compiler schonmal keine Fehler mehr=).

    Allerdings scheint der Code noch nicht wirklich zu funktionieren da er die Datei nicht ins angegebene Verzeichnis downloadet.

    Hier nochmal der veränderte Code:

    #include<iostream> 
    #include<windows.h> 
    #include<conio.h>
    #include<urlmon.h>
    #include<tchar.h>
    
    #pragma comment (lib, "Urlmon.lib")
    using namespace std; 
    
    int main() 
    {
    	URLDownloadToFile(NULL, _T("www.google.de"), _T("C://test.txt"), NULL, NULL);
    }
    


  • Ja, und was passiert denn? Wird eine Datei geschrieben? Wenn ja wohin?...



  • offensichtlich passiert gar nichts:

    es wird weder eine datei an den angegebenen Pfad (C://test.txt) geschrieben, noch passiert sonst irgendetwas auffälliges.

    vielleicht passiert ja deshalb nichts:

    1.kann das daran liegen, dass die Datei C://test.txt vielleicht schon existieren muss?

    edit: daran liegts nicht, habe ich grade ausprobiert. bleibt noch 2.^^

    2.kann man eine website überhaupt als .txt speichern oder muss man eine andere dateiendung (z.B. html oder htm) wählen?



  • Ich persönlich würde jetzt mal den Rückgabe Wert der Funktion checken.
    Vielleicht muss man halt doch noch CoInitializeEx(..) / CoUninitialize(..) aufrufen.
    Simon



  • also ich habe jetzt mal die Fuinktion GetLastError() angewendet, diese gab 0 zurück --> keine fehler!

    wie überprüft man jetzt den Rückgabewert der Funktion?


  • Administrator

    andi01 schrieb:

    wie überprüft man jetzt den Rückgabewert der Funktion?

    http://msdn.microsoft.com/en-us/library/ms775123.aspx

    Dort steht genau, was wann zurückgegeben wird.

    Grüssli



  • 1. nimm statt den Slashes (//) lieber Backslashes (\),
    die werden vom Compiler zu einem einzigen aufgelöst, was den korrekten Pfad "C:\test.txt" ergeben würde.
    kann also sein, dass Windows mit den Slashs macken macht (kann! nicht muss)

    2. an der Endung sollte es nicht liegen. Ich bezweifle, dass die Funktion überprüft, was für eine Datei heruntergeladen wird und dann festlegt, dass das Resultat vom selben Typ sein muss.

    3. Die Funktion gibt doch sicher einen Fehlercode zurück.
    Den solltest du dir mal anschauen



  • wie fängt man diesen Rückgabewert ab?

    edit: ich habe es jetzt auf Backslashes geändert, was jedoch nichts daran ändert, dass es immernoch nicht funktioniert =(.

    hier nochmam mein code:

    #include<iostream> 
    #include<windows.h> 
    #include<conio.h>
    #include<urlmon.h>
    #include<tchar.h>
    
    #pragma comment (lib, "Urlmon.lib")
    using namespace std; 
    
    int main() 
    {
    	URLDownloadToFile(NULL, _T("www.google.de"), _T("C:\\test.txt"), NULL, NULL);
    	getch();
    }
    

  • Administrator

    andi01 schrieb:

    wie fängt man diesen Rückgabewert ab?

    Wenn du das nicht weisst, wie hast du das dann bei GetLastError gemacht? 😕

    Grüssli



  • bei Getlasterror war es:

    cout>>GetLastError();
    

    das war einfach.

    aber bei

    cout>>URLDownloadToFile(NULL, _T("www.google.de"), _T("C:\\test.txt"), NULL, NULL);
    

    giebt der Kompiler 23 Fehlermeldungen aus.



  • HRESULT result = URLDownloadToFile(NULL, _T("www.google.de"), _T("C:\\test.txt"), NULL, NULL);
    switch (result)
    {
    case S_OK: cout << "Alles in Ordnung" << endl; break;
    case E_OUTOFMEMORY: cout << "Nicht genug freier Speicher oder ungültiger Puffer" << endl; break;
    case INET_E_DOWNLOAD_FAILURE: cout << "Fehler beim Download" << endl; break;
    }
    


  • erstaunlicherweise gibt das Programm einfach garnichts am Bildschirm aus 😮

    also muss es irgendein andere case sein der eingetreten ist (oder der code ist falsch).


  • Administrator

    andi01 schrieb:

    giebt der Kompiler 23 Fehlermeldungen aus.

    cout << URLDownloadToFile(NULL, _T("www.google.de"), _T("C:\\test.txt"), NULL, NULL);
    

    Kompiliert einwandfrei. Natürlich müssen es << sein und nicht >>. Aber ich denke mal, das war ein Schreibfehler hier im Forum. Zudem, wenn es wirklich bei so banalen Dingen scheitert, solltest du vielleicht zuerst C++ lernen, bevor du dich mit der WinAPI rumschlägst?
    2. Die Fehlermeldungen sind wohl so hoch geheim, dass du sie uns nicht zeigen kannst 😉

    Grüssli


Log in to reply