windows xp sp3 + ie6环境
如何在CInternetSession下传文件时,设置要求用户名口令的代理服务器?
如果安装了ie8,CInternetSession会自动采用ie的设置和用户保存的凭据,程序是完全透明的,但ie6下,相同的程序行为不同了,如何显式地设置代理服务器与用户名口令呢?
下面是我目前不能工作的代码,这个代码在ie8的环境里完全不必有SetOption()的动作都能自动正常。
如何实现代理服务器的设置?
如何在CInternetSession下传文件时,设置要求用户名口令的代理服务器?
如果安装了ie8,CInternetSession会自动采用ie的设置和用户保存的凭据,程序是完全透明的,但ie6下,相同的程序行为不同了,如何显式地设置代理服务器与用户名口令呢?
下面是我目前不能工作的代码,这个代码在ie8的环境里完全不必有SetOption()的动作都能自动正常。
如何实现代理服务器的设置?
BOOL GetHttpFile(LPCTSTR psUrl, LPCTSTR psLocalFile, CString &sErrMg)
{
//通过http获得远程的update文件。
char buf[65536];
CString sTemp;
CInternetSession sess;
char* sProxyServer = _T("http://192.168.1.9:8080");
char* sProxyUserName = _T("bejlife\\username");
char* sProxyPassword = _T("Password");
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = sProxyServer;
proxyinfo.lpszProxyBypass = NULL;
bool b = sess.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO), 0);
CHttpFile* fileGet;
try
{
fileGet=(CHttpFile*)sess.OpenURL(psUrl); //, 1, INTERNET_FLAG_TRANSFER_BINARY);
if(!fileGet)
{
sess.Close();
sErrMg = "不能打开远程文件!";
return FALSE;
}
fileGet->SetOption(INTERNET_OPTION_PROXY_USERNAME, (LPVOID)sProxyUserName, lstrlen(sProxyUserName) + 1, 0);
fileGet->SetOption(INTERNET_OPTION_PROXY_PASSWORD, (LPVOID)sProxyPassword, lstrlen(sProxyPassword) + 1, 0);
}
catch(CException* e)
{
fileGet = NULL;
}
if(!fileGet)
{
sess.Close();
sErrMg = "不能找到远程文件!";
return FALSE;
}
int iBuffLen;
DWORD dwStatus;
DWORD dwBuffLen = sizeof(dwStatus);
BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);
if(!( bSuccess && dwStatus>= 200&& dwStatus<300 ))
{
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("打开远程文件出错,错误码:%d", dwStatus);
return FALSE;
}
CFile fileWrite;
if( ! fileWrite.Open(psLocalFile, CFile::modeWrite|CFile::modeCreate))
{
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("本地文件打开出错.");
return FALSE;
}
iBuffLen = fileGet->Read((void*)buf, sizeof(buf));
while(iBuffLen != 0)
{
fileWrite.Write(buf, iBuffLen);
iBuffLen = fileGet->Read((void*)buf, sizeof(buf));
}
fileWrite.Close();
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("下载成功");
return TRUE;
{
//通过http获得远程的update文件。
char buf[65536];
CString sTemp;
CInternetSession sess;
char* sProxyServer = _T("http://192.168.1.9:8080");
char* sProxyUserName = _T("bejlife\\username");
char* sProxyPassword = _T("Password");
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = sProxyServer;
proxyinfo.lpszProxyBypass = NULL;
bool b = sess.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO), 0);
CHttpFile* fileGet;
try
{
fileGet=(CHttpFile*)sess.OpenURL(psUrl); //, 1, INTERNET_FLAG_TRANSFER_BINARY);
if(!fileGet)
{
sess.Close();
sErrMg = "不能打开远程文件!";
return FALSE;
}
fileGet->SetOption(INTERNET_OPTION_PROXY_USERNAME, (LPVOID)sProxyUserName, lstrlen(sProxyUserName) + 1, 0);
fileGet->SetOption(INTERNET_OPTION_PROXY_PASSWORD, (LPVOID)sProxyPassword, lstrlen(sProxyPassword) + 1, 0);
}
catch(CException* e)
{
fileGet = NULL;
}
if(!fileGet)
{
sess.Close();
sErrMg = "不能找到远程文件!";
return FALSE;
}
int iBuffLen;
DWORD dwStatus;
DWORD dwBuffLen = sizeof(dwStatus);
BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);
if(!( bSuccess && dwStatus>= 200&& dwStatus<300 ))
{
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("打开远程文件出错,错误码:%d", dwStatus);
return FALSE;
}
CFile fileWrite;
if( ! fileWrite.Open(psLocalFile, CFile::modeWrite|CFile::modeCreate))
{
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("本地文件打开出错.");
return FALSE;
}
iBuffLen = fileGet->Read((void*)buf, sizeof(buf));
while(iBuffLen != 0)
{
fileWrite.Write(buf, iBuffLen);
iBuffLen = fileGet->Read((void*)buf, sizeof(buf));
}
fileWrite.Close();
fileGet->Close();
sess.Close();
delete fileGet;
sErrMg.Format("下载成功");
return TRUE;
}