在 MFC 中使用 WinINet 的问题

Posted

技术标签:

【中文标题】在 MFC 中使用 WinINet 的问题【英文标题】:problems using WinINet in MFC 【发布时间】:2015-08-20 01:46:32 【问题描述】:

我在 MFC 中使用 WinINet 类将文件上传到网络服务器。 当我运行这个程序时,httpSendRequestEx 返回 12005 错误,这是无效的 url。 如果我将 http:// 放在 url 前面,httpSendRequestEx 会返回 12007 错误,即“无法解析服务器名称”。 我花了一整天的时间来解决这个问题,但我不知道如何解决它。 请帮帮我

这是我的代码。

CString m_strBoundary = ("abcdefg");
LPCTSTR lpszFilePath = "C:\\MFCprj\\WinINet_Example2\\WinINet_Example2\\Full.jpg";
LPCTSTR lpszFileName = "Full.jpg";;
HANDLE hFile = CreateFile("C:\\MFCprj\\WinINet_Example2\\WinINet_Example2\\Full.jpg", GENERIC_READ, 0, 0, 0, 0, 0);

HINTERNET hInternet = ::InternetOpen("WININETEXAMPLE", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(!hInternet)

    AfxMessageBox("InternetOpen has an error");


HINTERNET hConnection = ::InternetConnect(hInternet, "192.168.88.4:8090/mrbs/controller?do=XML_MULTIPART_TEST_ACTION", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); 
if(!hConnection)                                      

    AfxMessageBox("InternetConnect has an error");


HINTERNET hRequest = ::HttpOpenRequest(hConnection, "POST", "/jsp/inc/head.jsp", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if(!hRequest)

    AfxMessageBox("HttpOpenRequest has an error");


//HTTP header
_bstr_t strHeader;
strHeader = "Content-Type: multipart/form-data; boundary=";
strHeader = strHeader + m_strBoundary;
::HttpAddRequestHeaders(hRequest, (LPCTSTR)strHeader, -1, 0);

//Body header
_bstr_t strFilePartHead("--");
strFilePartHead = strFilePartHead + m_strBoundary;
strFilePartHead = strFilePartHead + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Full.jpg\"";
strFilePartHead = strFilePartHead + "\"\r\nContent-Type: application/vnd.ms-excel\r\n\r\n";

_bstr_t strFilePartTail("\r\n");
strFilePartTail = strFilePartTail + "--";
strFilePartTail = strFilePartTail + m_strBoundary;
strFilePartTail = strFilePartTail + "--\r\n";

INTERNET_BUFFERS BufferIn;
BufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
BufferIn.Next = NULL;
BufferIn.lpcszHeader = (LPCTSTR)strHeader;
BufferIn.dwBufferLength = 0;
BufferIn.dwBufferTotal = GetFileSize(lpszFilePath) + strlen( (LPCSTR)strFilePartHead ) + strlen( (LPCSTR)strFilePartTail );
BufferIn.dwHeadersLength = lstrlen( (LPCTSTR)strHeader );
BufferIn.dwHeadersTotal = lstrlen( (LPCTSTR)strHeader );
BufferIn.lpvBuffer = NULL;
BufferIn.dwOffsetHigh = 0;
BufferIn.dwOffsetLow = 0;

if(!::HttpSendRequestEx(hRequest, &BufferIn, NULL, 0, NULL))

    DWORD dwError = GetLastError();
    ::InternetCloseHandle(hRequest);
    ::InternetCloseHandle(hConnection);
    ::InternetCloseHandle(hInternet);

【问题讨论】:

这不是MFC,你可以使用WinAPI标签代替MFC 【参考方案1】:

InternetConnect 仅接受服务器名称/地址和端口。

hConnection = ::InternetConnect(hInternet, "192.168.88.4", 8090, ...);

那是因为InternetConnect 只连接到服务器(某处机器上的端口)。 URL 构成对服务器的请求的一部分,因此您传递给 InternetConnect 的附加字符串 ("/mrbs/controller?do=XML_MULTIPART_TEST_ACTION") 实际上需要提供给 HttpOpenRequest .

hRequest = ::HttpOpenRequest(hConnection, "POST", "/mrbs/controller?do=XML_MULTIPART_TEST_ACTION", ...);

我不确定您最初传递给 HttpOpenRequest"/jsp/inc/head.jsp" 适合放在哪里,但如果这也确实是 URL 的一部分,那么你会这样做:

hRequest = ::HttpOpenRequest(hConnection, "POST", "/mrbs/controller?do=XML_MULTIPART_TEST_ACTION/jsp/inc/head.jsp", ...);

【讨论】:

非常感谢。 hRequest = ::HttpOpenRequest(hConnection, "POST", "/mrbs/controller?do=XML_MULTIPART_TEST_ACTION", ...);它现在对我有用。 我可以再问一个问题吗?我尝试将图像文件上传到服务器,但只上传了 4kb。我应该修改什么以获得足够的缓冲区?? @JunHyunPark 我不知道,抱歉,您最好将其作为一个新问题发布。

以上是关于在 MFC 中使用 WinINet 的问题的主要内容,如果未能解决你的问题,请参考以下文章

MFC wininet CHttpConnection 线程安全吗?

Windbg里DLL相关下断点

如何中止使用 wininet 发送的请求?

wininet api 将文件发送到 http web 服务

如何从 Windows MFC 客户端使用 SSL?

基于VC++的MFC类库实现的简单FTP客户端