Search

'전체 글'에 해당되는 글 113건

  1. 2011.12.01 MFC CInternetSession클래스 사용시_유의점
MFC의 CInternetSession 클래스를 사용하면 간편하게 웹페이지를 읽어올 수 있죠..

일단 웹페이지를 열기위해 OpenURL() 멤버 함수를 호출합니다..

CStdioFile* OpenURL(" LPCTSTR pstrURL, DWORD dwContext = 1, DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0 );
Throw ( CInternetException );

요놈은 CStdioFile(pstrURL에 연결해서 가지고 온 내용이 담긴 파일) 포인터를 리턴값으로 가지고 있읍죠.

페이지 pstrURL 형식에 따라 원하는 클래스로 캐스팅이 가능합니다.

URL type Returns
file:// CStdioFile*
http:// CHttpFile*
gopher:// CGopherFile*
ftp:// CInternetFile*

제가 MSDN Library January 2001를 설치해서 보는데요..
이 함수 정보에서 Remarks나 Return Value란을 뒤져봐도

"리턴값으로 넘어온 파일 포인터를 어떻게 처리해야 한다"라는 언급은 전혀 없어서
그냥 썼었습니다.. 그랬더니 무지막지한 메모리 릭이..(무한루프 속에서 호출하였음..)

제가 무식해서 첨엔 메모리 새는 원인을 찾지못하고 헤매다가 이 함수가 왠지 걸쩍지근해서..

소스파일인 inet.cpp 파일을 직접 훓어보았더니..

리턴값이 CInternetSession의 멤버변수(CStdioFile)를 포인터로 돌려주는게 아니라 new로 생성된거 였더군요..

즉 리턴값에 대해 delete 처리가 반드시 필요하다는 거죠..(왜 멤버변수라고 단정 지었던 것인지 ㅡㅡ;)

덧붙여.. TRY-CATCH를 반드시 써주셔야 합니다.. 안그럼 프로그램 언제 종료될지 모릅니다... -_-;

고로 이 클래스를 이용하시는 분들은 다음과 같이 써주시면 안전(?)하겠습니당..

CInternetSession* pSession = NULL;
CStdioFile* pFile = NULL;
TCHAR szError[1024] = {0};

TRY
{
pSession = new CInternetSession;
pFile = pSession->OpenURL("http://www.devpia.com");
}
CATCH (CInternetException, pEx)
{
pEx->GetErrorMessage(szError, 1024);
}

END_CATCH

if (pFile != NULL)
{
//여기서 웹페이지 내용을 가지고 처리
//HTTP를 호출했을 시
CHttpFile* pHttpFile = (CHttpFile*)pFile;
delete pHttpFile;
pHttpFile = NULL;
pFile = NULL;
}

if (pSession != NULL)
{
//pSession->Close(); //CInternetSession 소멸자가 알아서 호출함
delete pSession;
pSession = NULL;
}