各位大侠,我做了一个使用WEB BROSWER控件获取html源文件的代码,目标是将其保存在本地文件里,代码如下:
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL;
ULONG ActualTextLength = 0; IStream *pStream=NULL;
HGLOBAL hHTMLText; if (!(pHTMLDocument = (IHTMLDocument2*)m_wndBrowser.get_Document())) //获取Document
return; if (FAILED(pHTMLDocument->QueryInterface(&pPSI))) //获取IPersistStreamInit 指针
{
// pHTMLDocument->Release();
return;
} //hHTMLText = GlobalAlloc(GMEM_FIXED, 10000);//分配内存
//memset((char*)hHTMLText,NULL,10000);//初始化清空
CreateStreamOnHGlobal(NULL, TRUE, &pStream);//将内存与流绑定
pPSI->Save(pStream, FALSE);//保存html到流对象 CString strMsg;
pStream->Read(strMsg.GetBuffer(),10000,&ActualTextLength);//我想把pStream流中的内容保存在CString 或是一个指针中
CString strPrint;
strPrint.Format("ActualTextLength:%d!", ActualTextLength);
AfxMessageBox( strPrint, MB_OK ); writefile(....);
不过ActualTextLength的值始终为0,感觉是没有读到东西,不知道是不是pStream的函数我没有用对?应该怎么改?
CreateStreamOnHGlobal函数的第一个参数我用的是NULL,是在其它帖子里看见的,我主要是因为不知道怎么获取网页的大小(请指点),又想让内存分配可以适应网页(不用分一个固定的很大的值,比如:10000...),所以创建了流后,想将其的内容保存在CString ,不知道用的对不对?
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL;
ULONG ActualTextLength = 0; IStream *pStream=NULL;
HGLOBAL hHTMLText; if (!(pHTMLDocument = (IHTMLDocument2*)m_wndBrowser.get_Document())) //获取Document
return; if (FAILED(pHTMLDocument->QueryInterface(&pPSI))) //获取IPersistStreamInit 指针
{
// pHTMLDocument->Release();
return;
} //hHTMLText = GlobalAlloc(GMEM_FIXED, 10000);//分配内存
//memset((char*)hHTMLText,NULL,10000);//初始化清空
CreateStreamOnHGlobal(NULL, TRUE, &pStream);//将内存与流绑定
pPSI->Save(pStream, FALSE);//保存html到流对象 CString strMsg;
pStream->Read(strMsg.GetBuffer(),10000,&ActualTextLength);//我想把pStream流中的内容保存在CString 或是一个指针中
CString strPrint;
strPrint.Format("ActualTextLength:%d!", ActualTextLength);
AfxMessageBox( strPrint, MB_OK ); writefile(....);
不过ActualTextLength的值始终为0,感觉是没有读到东西,不知道是不是pStream的函数我没有用对?应该怎么改?
CreateStreamOnHGlobal函数的第一个参数我用的是NULL,是在其它帖子里看见的,我主要是因为不知道怎么获取网页的大小(请指点),又想让内存分配可以适应网页(不用分一个固定的很大的值,比如:10000...),所以创建了流后,想将其的内容保存在CString ,不知道用的对不对?
解决方案 »
- 未写过视频处理和传输的程序,请问大家如果要实现像QQ那样把摄像头的图像传到另一端可以看到图像,需要些什么知识?
- 如何来实现指示灯?
- 对话框程序CDialog的问题~???
- 如何隐藏list中的某一行?
- 求一个算法:点是否在一个不规则多边形内
- 我想要做一个服务服务程序,而且要他有普通的程序界面,
- 如何 在对话框中显示bmp位图(不是资源位图,而是外部bmp图)
- 怎样才能完全删除一个对话框类,净需要删除什么东东??????
- 高手求救:Socket类通讯,一定给分!!!
- 【MFC】请问MFC中的工具条图标如何插入图片
- 100分求助,关于打印纸与屏幕显示图的比例关系
- 关于TransformFilter的问题(DirectShow)
IStream直接读入到CString中可能存在风险,因为流里面保存的字符串可能是任何编码类型,ANSI/UTF-8/UTF-16...等等,保存成文件是没问题的,要保存到字符串应该直接调用
IHTMLDocument3::get_documentElement 后再调用get_outerHTML获得UNICODE字符串。
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"Wininet.lib")
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<char> v;
CHAR szUrl[] = "http://www.baidu.com/";
CHAR szAgent[] = "";
HINTERNET hInternet1 =
InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
if (NULL == hInternet1)
{
InternetCloseHandle(hInternet1);
return FALSE;
}
HINTERNET hInternet2 =
InternetOpenUrl(hInternet1,szUrl,NULL,NULL,INTERNET_FLAG_NO_CACHE_WRITE,NULL);
if (NULL == hInternet2)
{
InternetCloseHandle(hInternet2);
InternetCloseHandle(hInternet1);
return FALSE;
}
DWORD dwMaxDataLength = 500;
PBYTE pBuf = (PBYTE)malloc(dwMaxDataLength*sizeof(TCHAR));
if (NULL == pBuf)
{
InternetCloseHandle(hInternet2);
InternetCloseHandle(hInternet1);
return FALSE;
}
DWORD dwReadDataLength = NULL;
BOOL bRet = TRUE;
do
{
ZeroMemory(pBuf,dwMaxDataLength*sizeof(TCHAR));
bRet = InternetReadFile(hInternet2,pBuf,dwMaxDataLength,&dwReadDataLength);
for (DWORD dw = 0;dw < dwReadDataLength;dw++)
{
v.push_back(pBuf[dw]);
}
} while (NULL != dwReadDataLength);
char *str = new char[v.size+1];
copy(v.begin(),v.end(), str);
str[v.size()]=0;
HANDLE hFile = CreateFile(_T("C:\\MyFile.txt"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建文本文件
CFile myFile(hFile);
myFile.Write(str, lstrlen(str));//将文本写入文件
myFile.Close();//关闭流
return 0;
}
这个是把www.baidu.com的源代码写如C:\MtFile.txt中
ULONG ActualTextLength = 0;
m_wndBrowser.Navigate(("www.baidu.com"),NULL,NULL,NULL,NULL);
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL; IStream *pStream=NULL;
HGLOBAL hHTMLText; if (!(pHTMLDocument = (IHTMLDocument2*)m_wndBrowser.get_Document())) //获取Document
return 1; if (FAILED(pHTMLDocument->QueryInterface(&pPSI))) //获取IPersistStreamInit 指针
{
// pHTMLDocument->Release();
return 1;
} CreateStreamOnHGlobal(NULL, TRUE, &pStream);//将内存与流绑定
pPSI->Save(pStream, FALSE); STATSTG statstg;
pStream->Stat(&statstg,STATFLAG_DEFAULT); //CString str.Format("%s%s",statstg.cbSize.HighPart,statstg.cbSize.LowPart);
ActualTextLength=statstg.cbSize.LowPart;//assume<4GB
unsigned char* ptext= new unsigned char[ActualTextLength+1];
memset(ptext,NULL,(ActualTextLength+1)); ULONG ReadSize = 0;
pStream->Read(ptext,ActualTextLength,&ReadSize);使用Stat后,可以得到网页大小-->ActualTextLength(3397),但是使用Read的时候ReadSize的值始终为0,ptext中也没有网页,这是怎么回事儿,指点指点,急!