王朝网络
分享
 
 
 

两种方法访问多层嵌套的frame

王朝other·作者佚名  2006-11-24
宽屏版  字体: |||超大  

========================================

在您的网站拜读了关于TWebBrowser的使用方法,但是一直有一个问题困扰我,就是如何取得frame嵌套frame的HTML的原码,我只是知道单个frame如何取得源码,但是多个frame嵌套就没有办法,请教一下!

答========================================

要得到源代码,必须先得到frame。访问frame一般说来有两种方法:

1、通过WebBrowser的文档接口得到frame的集合,再逐一访问。

HRESULT IHTMLDocument2::get_frames(IHTMLFramesCollection2 **p);

由IHTMLFramesCollection2接口的item方法,可以以frame的索引号(从0开始)或frame的名称来访问相应的frame,pvarResult则返回一个IDispatch接口(或一个IDispatch接口的数组,多层嵌套的情况).

HRESULT item(

VARIANT *pvarIndex,

VARIANT *pvarResult

);

例子如下,假设pWin是一个指向主窗口的有效的IHTMLWindow接口指针。

......

VARIANT frameRequested;

VARIANT frameOut;

IHTMLFramesCollection2* pFramesCol;

IHTMLWindow2* pRightFrameWindow;

IHTMLDocument2* pRightDoc;

frameRequested.vt = VT_BSTR;//若为VT_I4则以索引号来访问

frameRequested.bstrVal = L"rightframe";//以名称来访问

//frameRequested.vt = VT_I4;

//frameRequested.bstrVal = (BSTR)0;

hr = pWin->get_frames(&pFramesCol);

hr = pFramesCol->item(&frameRequested, &frameOut);

hr = frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)&pRightFrameWindow);

hr = pRightFrameWindow->get_document(&pRightDoc);

......

2、通过IOleContainer枚举嵌入对象的方式来访问WebBrowser对象。

void CMyHtmlView::RefreshFrames()

{

// 取得文档的IDispatch指针

LPDISPATCH lpDisp = NULL;

lpDisp = GetHtmlDocument();

if (lpDisp)

{

IOleContainer* pContainer;

HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer, (void**)&pContainer);

lpDisp->Release();

if (FAILED(hr))

return hr;

IEnumUnknown* pEnumerator;

// 获得枚举器

hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);

pContainer->Release();

if (FAILED(hr))

return hr;

IUnknown* pUnk;

ULONG uFetched;

// 枚举并刷新所有frame

for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)

{

IWebBrowser2* pBrowser;

hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);

pUnk->Release();

if (SUCCEEDED(hr))

{

pBrowser->Refresh();

pBrowser->Release();

}

}

pEnumerator->Release();

}

3、访问的多层嵌套frame

注意每个frame又可以包含自己的frame,而上面所说的方法则是针对一个WebBrowser的窗口实现的,并不会涉及到深层的frame。要实现多层嵌套frame的访问,只需要加入一点递归的操作就行了。如对1中的pRightFrameWindow和2中的pBrowser,将函数稍加修改,在得到两个指针后作递归调用即可。

4、访问源代码

下面的方法来自CHtmlView,是比较正规的方法(能够保持网页的原始格式)。

BOOL CHtmlView::GetSource(CString& refString)

{

BOOL bRetVal = FALSE;

CComPtr<IDispatch> spDisp = GetHtmlDocument();

if (spDisp != NULL)

{

HGLOBAL hMemory;

hMemory = GlobalAlloc(GMEM_MOVEABLE, 0);

if (hMemory != NULL)

{

CComQIPtr<IPersistStreamInit> spPersistStream = spDisp;

if (spPersistStream != NULL)

{

CComPtr<IStream> spStream;

if (SUCCEEDED(CreateStreamOnHGlobal(hMemory, TRUE, &spStream)))

{

spPersistStream->Save(spStream, FALSE);

LPCTSTR pstr = (LPCTSTR) GlobalLock(hMemory);

if (pstr != NULL)

{

// Stream is always ANSI, but CString

// assignment operator will convert implicitly.

bRetVal = TRUE;

TRY

{

refString = pstr;

}

CATCH_ALL(e)

{

bRetVal = FALSE;

DELETE_EXCEPTION(e);

}

END_CATCH_ALL

if(bRetVal == FALSE)

GlobalFree(hMemory);

else

GlobalUnlock(hMemory);

}

}

}

}

}

return bRetVal;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有