vc获得网页内容CInternetSession和CHttpFile导致内存泄露
在vc中采用CInternetSession 和CHttpFile 建立访问网页函数并在多线程下调用
导致内存泄露。这种泄露短期内无法察觉 必须运行长时间才能看出。
泄露函数如下:
CString gethtmlcontxt(CString strURL,int outtime )
{
try
{
CInternetSession mySession(NULL, 0);
CString m_strHTML, myData;
CHttpFile *myHttpFile = NULL;
// mySession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,outtime);
myHttpFile=(CHttpFile *)mySession.OpenURL(strURL);
while(myHttpFile->ReadString(myData))
{
m_strHTML= m_strHTML+ TEXT(" ") + myData;
}
myHttpFile->Close();
mySession.Close();
return m_strHTML;
}
catch (CException* e)
{
e=NULL;
}
return "";
}
后改成winnet访问网页问题解决.
//下载网页html内容
CString getwinnetweb(CString url)
{
CString str="";
try
{
char* szUrl = _T(url.GetBuffer(0));
url.ReleaseBuffer();
TCHAR szAgent[] = _T("");
HINTERNET hInternet1 = InternetOpen(_T("serverassistant"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
if (NULL == hInternet1)
{
InternetCloseHandle(hInternet1);
return "";
}
HINTERNET hInternet2 = InternetOpenUrl(hInternet1,szUrl,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE,NULL);
if (NULL == hInternet2)
{
InternetCloseHandle(hInternet2);
InternetCloseHandle(hInternet1);
return "";
}
char szBuffer[1024] = {0};
DWORD dwByteRead = 0;
// 循环读取缓冲区内容直到结束
while (InternetReadFile(hInternet2, szBuffer, 1023, &dwByteRead) && dwByteRead > 0)
{
str+=szBuffer;
// 清空缓冲区以备下一次读取
ZeroMemory(szBuffer, sizeof(szBuffer));
}
//ofs.close();
//AfxMessageBox(str);
InternetCloseHandle(hInternet2);
InternetCloseHandle(hInternet1);
}
catch (CException* e)
{
e=NULL;
}
return str;
}