2

我有一个 MFC 应用程序,它当前使用 CAtlHttpClient 来查询 Web 服务器以获取一些信息。

我想更改它,以便查询安全地通过服务器身份验证,使用 SSL。

谷歌搜索显示微软已经多次改变了他们支持这一点的方式,例如 WinInet、WinHTTP,但对于我来说,我无法弄清楚如何在 MSVS 2005 下使用 MFC 来完成上述操作。

该应用程序使用 C++,如果可能的话,我想避免将 .Net 拖入图片中。

任何帮助、提示、建议或指点都将不胜感激!

谢谢,

4

6 回答 6

4

你可以看看 Ultimate TCP/IP - 它对 MS 很友好,可能会做你想要的:

http://www.codeproject.com/KB/MFC/UltimateTCPIP.aspx

我使用这个工具包,它非常好。

于 2008-12-18T18:50:18.907 回答
2

早在 2002 年,我为 Windows Developer Magazine 写了一篇文章,展示了如何使用 OpenSSL 为 MFC 的 CAsyncSocket 提供 SSL。代码和文章在这里:http ://www.serverframework.com/asynchronousevents/2010/10/using-openssl-with-asynchronous-sockets.html可能对你有帮助。你也可以使用微软的 SChannel 做类似的事情,但它是涉及更多一点,因为 OpenSSL 会为您做一些缓冲,所以您需要做的就是将字节推入其中,直到您获得明文...

于 2008-12-18T17:51:43.750 回答
2

找到了一些可能符合要求的 Microsoft 示例代码的指针:http: //msdn.microsoft.com/en-us/library/s2ya483s (VS.80).aspx

然而,这在 AcquireCredentialsHandle 上失败了,这将是我对这个八月论坛的下一个问题......

于 2008-12-18T21:48:05.117 回答
1

只需使用 WinHttp,它是一个很棒的 AP​​I,并且拥有通过 HTTP 执行 SSL 所需的一切(此外还可以与 Vista 的代理配置一起使用)

于 2008-12-30T17:06:28.323 回答
0

如何使用作为OpenSSL一部分的libeay32.dllssleay32.dll文件:

https://code.google.com/p/openssl-for-windows/

于 2008-12-18T23:44:10.000 回答
0

我正在使用带有 MFC 应用程序的 Visual Studio 2005,该应用程序具有访问网站以获取小文件的功能。我正在使用这些WinINet函数,请参阅 Microsoft Windows Dev Center 中的 WinINet API 参考,它提供了一组简单的函数,这些函数使用 URL 访问网站,该 URL 指定协议(HTTP、HTTPS、FTP 等)以下拉一个小文件。

libcurl站点上查看此 Microsoft 技术说明,文章 ID 238425 - 信息:WinInet 不支持在服务中使用,已标记为自 2015 年 8 月 12 日起停用。文章摘要如下:

从服务或 Internet 信息服务器 (IIS) 应用程序(也是服务)运行时,不支持 Microsoft Win32 Internet 函数(从 WinInet.dll 导出)。本文讨论在服务或 Internet Information Server 应用程序中使用 WinInet.dll。

我在 MFC 应用程序中使用的适用源代码有一个对话框,该对话框使用 HTTPS 类型的 URL,向其附加附加信息以构建完整的 URI,然后转到网站以提取完整的小文件:

int GetFile (HINTERNET hOpen, TCHAR * szURL, BYTE  szTemp[4096])   
{
    DWORD dwSize;
    TCHAR szHead[15];
    HINTERNET  hConnect;

    szHead[0] = '\0';
    szTemp[0] = 0;

    // Opens a resource specified by a complete HTTP URL.
    if ( !(hConnect = InternetOpenUrl( hOpen, szURL, szHead, 15, INTERNET_FLAG_DONT_CACHE, 0)))
    {
        DWORD  dwlasterror = GetLastError();
        if (dwlasterror == ERROR_INTERNET_NAME_NOT_RESOLVED) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_NAME_NOT_RESOLVED - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_TIMEOUT) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_TIMEOUT - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_SERVER_UNREACHABLE) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_SERVER_UNREACHABLE - check LAN connectivity."));
        } else if (dwlasterror == ERROR_INTERNET_OPERATION_CANCELLED) {
            AfxMessageBox (_T("Error: ERROR_INTERNET_OPERATION_CANCELLED - check LAN connectivity."));
        } else {
            CString msg;
            msg.Format (_T("Error: GetLastError() returned %d."), dwlasterror);
            AfxMessageBox (msg);
        }
        return -2;
    }

    // Reads data from a handle opened by the InternetOpenUrl, FtpOpenFile, or HttpOpenRequest function.
    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;

    // Initializes an application's use of the WinINet functions.
    hInternet= InternetOpen (_T("DeviceConfig"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, NULL);
    if (hInternet) {
        // if open succeeded then get the file and close the handle as we be done.
        result = GetFile (hInternet, szURL, szTemp) ; 
        InternetCloseHandle(hInternet);
    }
    return result ;
}
于 2015-08-13T00:29:59.270 回答