设置代理后HttpSendRequest函数在Unicode环境下出错

fffjjjhhh 2014-03-03 07:18:42
发现一个奇怪的问题,设置代理后HttpSendRequest函数在Unicode环境下出错,设置代理后HttpSendRequest函数在ANSI环境下可以使用。如果不设置代理的话HttpSendRequest一切正常,这是怎么回事,想请高手解答一下,我用的VS2010,而且必须用Unicode环境。以下为代码:
string CTestDlg::doGet1(CString   istrObjet)
{


string sErrMg;
string httpsource;
BOOL b=TRUE;

HINTERNET m_hConnection = InternetConnect(
m_hInternet,
m_strServer,
m_nPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
INTERNET_FLAG_NO_UI,
NULL);

if (FALSE == m_hConnection)
{
InternetCloseHandle(m_hConnection);
InternetCloseHandle(m_hInternet);
sErrMg=_T("网络未连接上:建立网络连接失败");
return sErrMg;
}


static LPCTSTR s_szAcceptTypes[] = { _T("*/*"), NULL };

HINTERNET m_hRequest = HttpOpenRequest(
m_hConnection, _T("GET"),
istrObjet,
_T("HTTP/1.0"), NULL,
s_szAcceptTypes,
INTERNET_FLAG_NO_UI | INTERNET_FLAG_KEEP_CONNECTION, // | ((m_url.GetScheme() == ATL_URL_SCHEME_HTTPS) ? INTERNET_FLAG_SECURE : 0)
NULL);
if (FALSE == m_hRequest)
{
InternetCloseHandle(m_hRequest);
InternetCloseHandle(m_hConnection);
InternetCloseHandle(m_hInternet);
sErrMg=_T("网络未连接上:打开网络连接失败");
return sErrMg;
}

CString tAddHost;
tAddHost=_T("Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
HttpAddRequestHeaders(m_hRequest,tAddHost,tAddHost.GetLength( ),HTTP_ADDREQ_FLAG_ADD);


tAddHost=_T("Accept-Language: zh-CN");
HttpAddRequestHeaders(m_hRequest,tAddHost,tAddHost.GetLength( ),HTTP_ADDREQ_FLAG_ADD);


tAddHost=_T("Accept-Encoding: gzip, deflate");
HttpAddRequestHeaders(m_hRequest,tAddHost,tAddHost.GetLength( ),HTTP_ADDREQ_FLAG_ADD);

tAddHost=_T("Connection: Keep-Alive");
HttpAddRequestHeaders(m_hRequest,tAddHost,tAddHost.GetLength( ),HTTP_ADDREQ_FLAG_ADD);

b = HttpSendRequest(m_hRequest, NULL, 0,
NULL, 0);

if (FALSE == b)
{
InternetCloseHandle(m_hRequest);
InternetCloseHandle(m_hConnection);
InternetCloseHandle(m_hInternet);
sErrMg=_T("网络未连接上:向服务器发送请求失败");
return sErrMg;
}


TCHAR cookbuffer[512];


DWORD TRF=512;
DWORD TRF1=0;
b=HttpQueryInfo(m_hRequest, HTTP_QUERY_SET_COOKIE, cookbuffer,
&TRF,&TRF1);
if(FALSE==b)
{
sErrMg=_T("网络未连接上:未获取COOKIE");

}


// int iStatus = GetInternetRequestStatusCode(m_hRequest);
/*
if(!(iStatus>= 200&& iStatus<300 ))
{
InternetCloseHandle(m_hRequest);
InternetCloseHandle(m_hConnection);
InternetCloseHandle(m_hInternet);
sErrMg.Format(_T("网络未连接上:打开远程文件出错,错误码:%d"), iStatus);
return FALSE;
}*/

byte pData[65535];
DWORD dwReadedLen;
DWORD dwWrittenLen;

while(1)
{
b = InternetReadFile(m_hRequest, (LPVOID)pData, sizeof(pData), &dwReadedLen);
if (b == FALSE)
{
// CloseHandle(hfile);
InternetCloseHandle(m_hRequest);
InternetCloseHandle(m_hConnection);
// InternetCloseHandle(m_hInternet);
sErrMg=_T("网络未连接上:读取文件失败");
return sErrMg;
}
if(dwReadedLen == 0)
{
break;
}
pData[dwReadedLen]=0;
httpsource+=(char*)pData;


}

// CloseHandle(hfile);
InternetCloseHandle(m_hRequest);
InternetCloseHandle(m_hConnection);
//InternetCloseHandle(m_hInternet);
return httpsource;


}
...全文
440 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2014-03-30
  • 打赏
  • 举报
回复
lz这个估计直接 CString iDlText=_T("21.12.7.8"); char *strProxyList=UnicodeToGB2312(iDlText);//在Unicode环境下是加了这一句就好了 ====> char *strProxyList="21.12.7.8"; 就可以
fffjjjhhh 2014-03-30
  • 打赏
  • 举报
回复
原来是这样写的,我就奇怪lpszProxy是ANSI字符,iDlText是Unicode字符,编译也不报错,在其它出地方出现这种情况会报错的,搞的我十几天找不到原因. CString iDlText=_T("21.12.7.8"); //LPCTSTR INTERNET_PROXY_INFO proxyinfo; proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY; proxyinfo.lpszProxy=iDlText; proxyinfo.lpszProxyBypass = NULL; DWORD dwStatusCode; CString data; if(!SetOption(INTERNET_OPTION_PROXY,(LPVOID)&proxyinfo,sizeof(INTERNET_PROXY_INFO))) //设置代理服务器 { proxyinfo.dwAccessType=INTERNET_OPEN_TYPE_DIRECT; SetOption(INTERNET_OPTION_PROXY,(LPVOID)&proxyinfo,sizeof(INTERNET_PROXY_INFO)); return false; }
fffjjjhhh 2014-03-30
  • 打赏
  • 举报
回复
找到原因了,真的很无语 CString iDlText=_T("21.12.7.8"); char *strProxyList=UnicodeToGB2312(iDlText);//在Unicode环境下是加了这一句就好了 //LPCTSTR INTERNET_PROXY_INFO proxyinfo; proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY; proxyinfo.lpszProxy=(LPCTSTR)strProxyList; proxyinfo.lpszProxyBypass = NULL; DWORD dwStatusCode; CString data; if(!SetOption(INTERNET_OPTION_PROXY,(LPVOID)&proxyinfo,sizeof(INTERNET_PROXY_INFO))) //设置代理服务器 { proxyinfo.dwAccessType=INTERNET_OPEN_TYPE_DIRECT; SetOption(INTERNET_OPTION_PROXY,(LPVOID)&proxyinfo,sizeof(INTERNET_PROXY_INFO)); return false; } 看了一下INTERNET_PROXY_INFO 的定义 typedef struct { // // dwAccessType - INTERNET_OPEN_TYPE_DIRECT, INTERNET_OPEN_TYPE_PROXY, or // INTERNET_OPEN_TYPE_PRECONFIG (set only) // DWORD dwAccessType; // // lpszProxy - proxy server list // LPCTSTR lpszProxy; // // lpszProxyBypass - proxy bypass list // LPCTSTR lpszProxyBypass; } INTERNET_PROXY_INFO, * LPINTERNET_PROXY_INFO; 这是InternetSetOption函数的定义,也是分A和W的,本来想着代理地址会自动区别A字符串和W字符串的,谁知根本没有任何区别,所以在Unicode环境下代理地址也只能用A字符串了,不知道这算不算微软的BUG,搞的我快崩溃了.看来还是用WINSOCK比较好.请大家发表一下意见就结贴. BOOLAPI InternetSetOptionA( __in_opt HINTERNET hInternet, __in DWORD dwOption, __in_opt LPVOID lpBuffer, __in DWORD dwBufferLength ); BOOLAPI InternetSetOptionW( __in_opt HINTERNET hInternet, __in DWORD dwOption, __in_opt LPVOID lpBuffer, __in DWORD dwBufferLength ); #ifdef UNICODE #define InternetSetOption InternetSetOptionW #else #define InternetSetOption InternetSetOptionA #endif // !UN
oyljerry 2014-03-03
  • 打赏
  • 举报
回复
The attempt to connect to the server failed. 估计还是参数有问题
fffjjjhhh 2014-03-03
  • 打赏
  • 举报
回复
错误代码为12029
Eleven 2014-03-03
  • 打赏
  • 举报
回复
那你改用后面带A的函数吧,比如HttpSendRequestA(...)这之类的
fffjjjhhh 2014-03-03
  • 打赏
  • 举报
回复
顶一下顶一下

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧