2 Stimmen

Wie spricht man SSL von einem Windows MFC-Client?

Ich habe eine MFC-Anwendung, die derzeit CAtlHttpClient verwendet, um einen Webserver nach Informationen abzufragen.

Ich möchte dies so ändern, dass die Abfrage sicher über Serverauthentifizierung mit SSL erfolgt.

Ein Google-Suche zeigt, dass Microsoft die Art und Weise, wie sie dies unterstützen, mehrmals geändert hat, z. B. WinInet, WinHTTP, aber ich kann einfach nicht herausfinden, wie ich dies mit MFC unter MSVS 2005 machen soll.

Die Anwendung ist in C++, und wenn möglich, würde ich gerne vermeiden, .Net ins Spiel zu bringen.

Jede Hilfe, Hinweise, Vorschläge oder Anhaltspunkte sind dankbar willkommen!

Vielen Dank,

ony

0voto

Richard Chambers Punkte 15587

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 ;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X