利用CInternetSession中的成员函数OpenURL来打开网页
再CHttpFile来获取网页的源码,CInternetSession类在afxinet.h头文件中
CStdioFile* OpenURL
(
LPCTSTR pstrURL, //URL地址,或者本地文件的地址也可以
DWORD_PTR dwContext = 1, //上下文ID
DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII,//标记
LPCTSTR pstrHeaders = NULL,//发送到服务器的数据头
DWORD dwHeadersLength = 0//发送到服务器的数据头长度
)
效果如图:
解析URL地址:
解析本地文件地址:
代码如下:
UpdateData(TRUE);
m_content = "";
CInternetSession session(nullptr,0);//创建Internet会话
CHttpFile* pHttpFile=nullptr; //网页文件
try
{
//获取已经打开的网页代码文件
pHttpFile = (CHttpFile*)session.OpenURL(m_url);
}
catch (CInternetException* e)
{
e->ReportError();
delete e;
return;
}
CString strTemp;
//一行行读取网页的内容
while (pHttpFile->ReadString(strTemp))
{ //换行
m_content += Convert(strTemp, CP_UTF8, CP_ACP) + TEXT("\r\n");
}
UpdateData(FALSE);
pHttpFile->Close();
delete pHttpFile;
session.Close();
其中转换文件编码的函数实现如下:
//转换编码格式
CString Convert(_In_ CString strContent, _In_ int sourceCodepage, _In_ int targetCodepage)
{
int len = strContent.GetLength();
int unicodeLen = MultiByteToWideChar(sourceCodepage, 0, strContent, -1, nullptr, 0);
wchar_t *pUnicode;
pUnicode = new wchar_t[unicodeLen + 1];
memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage, 0, strContent, -1, (LPWSTR)pUnicode, unicodeLen);
BYTE *pTargetData = nullptr;
int targetLen = WideCharToMultiByte(targetCodepage, 0, (LPWSTR)pUnicode, -1,
(char*)pTargetData, 0, nullptr, nullptr);
pTargetData = new BYTE[targetLen + 1];
memset(pTargetData, 0, targetLen + 1);
WideCharToMultiByte(targetCodepage, 0, (LPWSTR)pUnicode, -1,
(char*)pTargetData, targetLen, nullptr, nullptr);
CString rt;
rt.Format("%s", pTargetData);
delete[] pUnicode;
delete[] pTargetData;
return rt;
}
注意:打开URL是windows调用IE(edge)的结果,所以如果IE浏览器不能正常打开网页的话,这个执行会失败.