URLDownloadToFile - Fehler: no matching function...



  • Hallo,

    ich möchte gern mit meinem CBuilder 10.3.3 eine Datei downloaden. Im CBuilder 2010 habe ich dazu diesen Code genutzt:

    AnsiString myAdress = "www.google.de";
    AnsiString myFile = "Testfile.txt";
    	URLDownloadToFile(NULL, myAdress, myFile, 0, NULL );
    

    Eingebunden sind:

    #include <urlmon.h>
    #pragma comment (lib, "Urlmon.lib")
    

    Zudem habe ich meinem Projekt folgende Dateien zugefügt:

    urlmon.lib
    urlmon.dll
    

    Beim Compilieren erhalte ich nun folgenden Fehler:

    [bcc32c Fehler] UnMain.cpp(31): no matching function for call to 'URLDownloadToFileA'
      urlmon.h(4822): candidate function not viable: no known conversion from 'System::AnsiString' (aka 'AnsiStringT<0>') to 'LPCSTR' (aka 'const char *') for 2nd argument
    

    Hat jemand einen Tip?

    Gruß
    Torsten



  • AnsiString hat doch auch eine Memberfunktion c_str()?

    Alternativ:

    const TCHAR* myAdress = TEXT("www.google.de");
    const TCHAR* myFile = TEXT("Testfile.txt");
    URLDownloadToFile(NULL, myAdress, myFile, 0, NULL );
    

    Oder mit std::string:

    typedef std::basic_string<TCHAR> tstring;
    tstring myAdress = TEXT("www.google.de");
    tstring myFile = TEXT("Testfile.txt");
    URLDownloadToFile(NULL, myAdress.c_str(), myFile.c_str(), 0, NULL );
    

    So sollte es dann auch mit den AnsiStrings gehen. Edit: Dann müsstest du allerdings direkt die A-Version, also URLDownloadToFileA aufrufen.

    @torsten_156 sagte in URLDownloadToFile - Fehler: no matching function...:

    Zudem habe ich meinem Projekt folgende Dateien zugefügt:

    urlmon.lib
    urlmon.dll
    

    Du hast doch schon das #pragma comment (lib, )? Nimm die Dateien mal wieder raus.

    Der Returnwert von URLDownloadToFile sollte natürlich auch noch geprüft werden.



  • So funktioniert es:

    const TCHAR* myAdress = TEXT("www.google.de");
    const TCHAR* myFile = TEXT("Testfile.txt");
    HRESULT hr = URLDownloadToFile(NULL, myAdress, myFile, 0, NULL );
    

    Für den Rückgabewert muss ja der letze Parameter nicht NULL sein (lt. Doku). Komme nur nicht klar damit! Wie muss ich den verwenden???



  • @torsten_156
    Nein, dein Rückgabewert ist ein HRESULT. Der letzte Parameter ist ein Pointer auf ein konkretes IBindStatusCallback Objekt. Das musst du selbst implementieren und musst dich in die COM Welt begeben. Da wird´s schnell schmerzhaft 😕
    Was du meinst ist die verbesserter Fehlerkontrolle und Fortschrittsverwaltung, für die brauchst du halt dieses IBindStatusCallback Objekt.
    Vielleicht brauchst du den ganzen COM-Overhead nicht und kannst direkt von IBindStatusCallback ableiten, dann wird das doch nicht so fürchterlich. Kann ich aber im Moment nicht viel zu sagen, würd´s einfach ausprobieren.


Anmelden zum Antworten