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 konkretesIBindStatusCallback
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 diesesIBindStatusCallback
Objekt.
Vielleicht brauchst du den ganzen COM-Overhead nicht und kannst direkt vonIBindStatusCallback
ableiten, dann wird das doch nicht so fürchterlich. Kann ich aber im Moment nicht viel zu sagen, würd´s einfach ausprobieren.