各位大虾,帮帮忙:
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL; 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(hHTMLText, TRUE, &pStream);//将内存与流绑定
pPSI->Save(pStream, FALSE); 我使用上述代码,可以将网页保存在hHTMLText中,不过我想问问如何通过IHTMLDocument2 获取网页的大小,因为GlobalAlloc函数我使用的是一个定值,如果可以基于网页大小分配就比较好了!
IHTMLDocument2 *pHTMLDocument=NULL;
IPersistStreamInit *pPSI=NULL; 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(hHTMLText, TRUE, &pStream);//将内存与流绑定
pPSI->Save(pStream, FALSE); 我使用上述代码,可以将网页保存在hHTMLText中,不过我想问问如何通过IHTMLDocument2 获取网页的大小,因为GlobalAlloc函数我使用的是一个定值,如果可以基于网页大小分配就比较好了!
{
m_ocxMsg.Navigate(("about:blank"),NULL,NULL,NULL,NULL);CComPtr<IDispatch> spDisp = m_ocxMsg.get_Document(); if(spDisp != NULL)
{
CComQIPtr<IPersistStreamInit> spPersistStream(spDisp);
if (spPersistStream != NULL)
{
LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR,strMsg.GetLength()+1);
lstrcpy(lpMem,strMsg.GetBuffer());
CComPtr<IStream>spStream;
CreateStreamOnHGlobal( lpMem, TRUE, &spStream );
// 初始化后,装载显示
spPersistStream->InitNew();
spPersistStream->Load(spStream );
}
}
还想问你两个问题:
1:如果我想把IStream中的内容保存在文件里,应该怎么弄?最好可以提供点儿IStream的开发资料;
2:我想把网页中的参数提取出来或是设置新参数,使用IHTMLDocument2 接口可不可以,应该怎么做,我看了很久MSDN,感觉有点晕,能不能提供点儿IHTMLDocument2 的开发资料?或是介绍一下向这些接口的学习经验,非常感谢!
2.IHtmlDocument2 getElementsByTagName()
GetHtmlSrc(CExplorer_t &ExplorerObj ,CString strMsg)
{
//m_ocxMsg.Navigate(("about:blank"),NULL,NULL,NULL,NULL); CComPtr <IDispatch> spDisp = ExplorerObj.get_Document(); if(spDisp != NULL)
{
CComQIPtr <IPersistStreamInit> spPersistStream(spDisp);
if (spPersistStream != NULL)
{
LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR,strMsg.GetLength()+1);
lstrcpy(lpMem,strMsg.GetBuffer()); CComPtr <IStream>spStream;
CreateStreamOnHGlobal( lpMem, TRUE, &spStream );
// 初始化后,装载显示
spPersistStream->InitNew();
spPersistStream->Load(spStream ); ::MessageBox(NULL,_T(strMsg),_T("test"),MB_OK); spStream.Release();
spPersistStream.Release();
}
} return 0;
}这个函数用于获取html src并显示主调函数为
m_wndBrowser.Navigate(("www.baidu.com"),NULL,NULL,NULL,NULL);
CString HtmlSrc("");
GetHtmlSrc(m_wndBrowser,HtmlSrc);其中的m_wndBrowser为web browser控件变量。不过运行时html源代码始终无法获取,我发现strMsg的内容始终没有,按照理解GlobalAlloc函数的第二个参数是内存大小,这里的调用中为1,请问如果内存初始大小为1,后面的IStream操作中如果保存的网页大小大于原有内存大小(这里为1),是不是会自动分配新的内存?
或者就是对于你的示例代码我的理解错误了,示例中的CString应该怎么初始化?另外一个问题就是GetHtmlSrc的函数体不变,不过声明如果第一个参数CExplorer_t ExplorerObj 不是引用,VS2005会报错,这是怎么回事儿?错误代码:error C2248: “CObject::CObject”: 无法访问 private 成员还有问题就是:
IHtmlDocument2 和IPersistStreamInit 这些是什么东东,我的理解就是控件提供的使用接口(实际操作就是基于控件生成一个类变量,该类就提供了控件的使用接口,不知道对不对?)这些好象是COM接口吧,这方面我一直不清楚,设计思想是什么,有什么功能,怎么用,能不能说的详细准确一点儿,最好提供一点儿学习的资料,我想好好看看,补补!非常感谢。