如何实现对Frame中HTML源码的直接读写

FBStudio 2000-10-07 11:26:00
CMyView(派生于CHtmlView)的成员函数SetHtml的作用是在框架lpszTargetFrameName中显示lpszHtml所代表的Web内容(lpszHtml就是HTML源码),当lpszTargetFrameName为空时则直接显示在CMyView所在的页面中。程序运行时对非Frame可以正常工作,可对Frame却检取不到文档对象的IPersistStreamInit接口.
要求:
实现对Frame中HTML源码的直接读写(不能借助于临时文件);
给出例程
对最早给出可行方案的至少给予200分,其他人酌情给分。
如分数不够可以再加。

下面是SetHtml程序的实现
BOOL CMyView::SetHtml(LPCTSTR lpszHtml, LPCTSTR lpszTargetFrameName)
{
LPSTREAM pStream=NULL;
HGLOBAL hHTMLText=NULL;
IPersistStreamInit *psi=NULL;
LPDISPATCH pDisp=GetHtmlDocument( );
if (pDisp==NULL) return FALSE;
IHTMLDocument2 *pDoc=NULL;
HRESULT hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
pDisp->Release();
if (hr!=S_OK) return FALSE;
if (lpszTargetFrameName&&_tcslen(lpszTargetFrameName)>0)
{
IHTMLFramesCollection2 *pFrames=NULL;
hr=pDoc->get_frames(&pFrames);
pDoc->Release();
pDoc=NULL;
if (hr==S_OK)
{
COleVariant varIndex(lpszTargetFrameName),varResult;
hr=pFrames->item(&varIndex, &varResult);
pFrames->Release();
pDisp=varResult.pdispVal;
if (hr==S_OK&&pDisp!=NULL)
{
IHTMLWindow2 *pWin = NULL;
hr=pDisp->QueryInterface(IID_IHTMLWindow2,(void**)&pWin);
pDisp->Release();
if (hr==S_OK)
{
hr=pWin->get_document(&pDoc);
pWin->Release();
if (hr!=S_OK) return FALSE;
}
}
}
}
try
{
//一面这行对于Frame总是查询不到IPersistStreamInit接口
if (pDoc->QueryInterface(IID_IPersistStreamInit, (void**)&psi)!=S_OK) throw 1;
if (psi->InitNew()!=S_OK) throw 2;
int len=_tcslen(lpszHtml)+1;
hHTMLText=GlobalAlloc(GPTR,len*sizeof(TCHAR));
if (hHTMLText==NULL) throw 3;
_tcscpy((LPTSTR)hHTMLText,lpszHtml);
if (CreateStreamOnHGlobal(hHTMLText, true, &pStream)!=S_OK) throw 4;
if (psi->Load(pStream)!=S_OK) throw 5;
return TRUE;
}
catch(int e)
{
switch(e)
{
case 5:
pStream->Release();
case 4:
GlobalFree(hHTMLText);
case 3:
case 2:
psi->Release();
case 1:
pDoc->Release();
break;
}
return FALSE;
}
}
...全文
442 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxbyl 2001-04-12
  • 打赏
  • 举报
回复
你先别急着给分,我去试试先
fb2000 2001-04-12
  • 打赏
  • 举报
回复
在有Frame的情况下是行不通的。
FBStudio 2001-04-12
  • 打赏
  • 举报
回复
给分了
FBStudio 2001-03-11
  • 打赏
  • 举报
回复
怎么给不了分?
FBStudio 2001-03-11
  • 打赏
  • 举报
回复
送分
FBStudio 2000-12-28
  • 打赏
  • 举报
回复
来取分啊!
FBStudio 2000-12-06
  • 打赏
  • 举报
回复
又来了
FBStudio 2000-11-11
  • 打赏
  • 举报
回复
不达送分之目的,誓不罢休!
FBStudio 2000-10-24
  • 打赏
  • 举报
回复
不回答没关系,可以把分领走
mywater 2000-10-16
  • 打赏
  • 举报
回复
使用脚本不行吗??IWebBrowser2装入网页,在网页中使用脚本,把目标设置为目标框架就行吧???

FBStudio 2000-10-16
  • 打赏
  • 举报
回复
我的问题实现是: 如何用VC在Frame中直接显示内存中的HTML页面而不借助于任何临时文件
oldworm 2000-10-13
  • 打赏
  • 举报
回复
我分析Html代码从来都不使用ms现成的东西,直接将Html文件作为文本文件进行词法分析,当然这需要很强的缓冲分析功底,不是任何人都可以作的。
zhq2000 2000-10-13
  • 打赏
  • 举报
回复
这个问题我也遇到过,当我用javascript访问时,IE告诉我 权限不足 或 禁止访问!
yandw 2000-10-12
  • 打赏
  • 举报
回复
其实我也很想帮你,我也对VC边望上程序感兴趣,可我 是出学者,没办法,我将关注
这各问题。
FBStudio 2000-10-12
  • 打赏
  • 举报
回复
将送分进行到底!
FBStudio 2000-10-09
  • 打赏
  • 举报
回复
还差13人啊
xwind 2000-10-09
  • 打赏
  • 举报
回复
不是不看,是不懂啊:(
FBStudio 2000-10-08
  • 打赏
  • 举报
回复
这是本人加入CSDN后提出的第一个问题,谁知没人响应。看来我也应该离开CSDN了。
前15名跟贴者无论菜鸟还是老鸟每人均可获20分
FBStudio 2000-10-08
  • 打赏
  • 举报
回复
to edyang
目前我就是用的临时文件,我希望有更好的方法。我觉得MS不会这么蠢的。
Edward 2000-10-08
  • 打赏
  • 举报
回复
俺试过了,确实如你所说,行不通。
最好的办法实用临时文件,调用 CHtmlView::Navigate2,有个参数可以指定 Target Frame。
加载更多回复(2)

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧