Ich benutze Visual Studio 2005 mit einer MFC-Anwendung, die Funktionen zum Zugriff auf eine Website für eine kleine Datei hat. Ich benutze die WinINet
-Funktionen, siehe die WinINet-API-Referenz im Microsoft Windows Dev Center, die einen einfachen Satz von Funktionen bereitstellt, um auf eine Website zuzugreifen, die eine URL verwendet, um das Protokoll (HTTP, HTTPS, FTP usw.) anzugeben, um eine kleine Datei herunterzuladen.
Auf der libcurl
-Website gab es einen Verweis auf diese Microsoft Technical Note, Artikel-ID 238425 - INFO: WinInet wird nicht für die Verwendung in Diensten unterstützt, die seit dem 12. Aug 2015 als eingestellt markiert ist. Die Zusammenfassung des Artikels lautet:
Die Microsoft Win32-Internetfunktionen (exportiert aus WinInet.dll) werden nicht unterstützt, wenn sie aus einem Dienst oder einer Internet Information Server (IIS)-Anwendung (auch ein Dienst) ausgeführt werden. In diesem Artikel wird die Verwendung der WinInet.dll in einem Dienst oder in Internet Information Server-Anwendungen diskutiert.
Der entsprechende Quellcode, den ich in meiner MFC-Anwendung verwende, hat ein Dialogfeld, das eine URL vom Typ HTTPS verwendet, an die zusätzliche Informationen angehängt werden, um eine vollständige URI zu erstellen und dann zur Website zu gehen, um die vollständige kleine Datei herunterzuladen, ist:
int GetFile (HINTERNET hOpen, TCHAR * szURL, BYTE szTemp[4096])
{
DWORD dwSize;
TCHAR szHead[15];
HINTERNET hConnect;
szHead[0] = '\0';
szTemp[0] = 0;
// Öffnet eine Ressource, die durch eine vollständige HTTP-URL angegeben ist.
if ( !(hConnect = InternetOpenUrl( hOpen, szURL, szHead, 15, INTERNET_FLAG_DONT_CACHE, 0)))
{
DWORD dwlasterror = GetLastError();
if (dwlasterror == ERROR_INTERNET_NAME_NOT_RESOLVED) {
AfxMessageBox (_T("Fehler: ERROR_INTERNET_NAME_NOT_RESOLVED - LAN-Verbindung überprüfen."));
} else if (dwlasterror == ERROR_INTERNET_TIMEOUT) {
AfxMessageBox (_T("Fehler: ERROR_INTERNET_TIMEOUT - LAN-Verbindung überprüfen."));
} else if (dwlasterror == ERROR_INTERNET_SERVER_UNREACHABLE) {
AfxMessageBox (_T("Fehler: ERROR_INTERNET_SERVER_UNREACHABLE - LAN-Verbindung überprüfen."));
} else if (dwlasterror == ERROR_INTERNET_OPERATION_CANCELLED) {
AfxMessageBox (_T("Fehler: ERROR_INTERNET_OPERATION_CANCELLED - LAN-Verbindung überprüfen."));
} else {
CString msg;
msg.Format (_T("Fehler: GetLastError() hat %d zurückgegeben."), dwlasterror);
AfxMessageBox (msg);
}
return -2;
}
// Liest Daten von einem Handle, das von der InternetOpenUrl-, FtpOpenFile- oder HttpOpenRequest-Funktion geöffnet wurde.
if (InternetReadFile (hConnect, szTemp, 4096, &dwSize) )
{
if (dwSize) {
return dwSize;
}
return -3;
}
return -4;
}
int DownloadURLImage (TCHAR * szURL, BYTE szTemp[4096])
{
int result = -1;
HINTERNET hInternet;
// Initialisiert die Verwendung der WinINet-Funktionen in einer Anwendung.
hInternet= InternetOpen (_T("DeviceConfig"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);
if (hInternet) {
// Wenn das Öffnen erfolgreich war, dann die Datei holen und den Handle schließen, da wir fertig sind.
result = GetFile (hInternet, szURL, szTemp) ;
InternetCloseHandle(hInternet);
}
return result ;
}