|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听)会见========================================
在您的网站拜读了关于TWebBrowser的利用办法,可是一向有一个成绩困扰我,就是怎样获得frame嵌套frame的HTML的原码,我只是晓得单个frame怎样获得源码,可是多个frame嵌套就没有举措,就教一下!
答========================================
要失掉源代码,必需先失掉frame。会见frame一样平常说来有两种办法:
1、经由过程WebBrowser的文档接口失掉frame的汇合,再一一会见。
HRESULTIHTMLDocument2::get_frames(IHTMLFramesCollection2**p);
由IHTMLFramesCollection2接口的item办法,能够以frame的索引号(从0入手下手)或frame的称号来会见响应的frame,pvarResult则前往一个IDispatch接口(或一个IDispatch接口的数组,多层嵌套的情形).
HRESULTitem(
VARIANT*pvarIndex,
VARIANT*pvarResult
);
例子以下,假定pWin是一个指向主窗口的无效的IHTMLWindow接口指针。
......
VARIANTframeRequested;
VARIANTframeOut;
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工具。
voidCMyHtmlView::RefreshFrames()
{
//获得文档的IDispatch指针
LPDISPATCHlpDisp=NULL;
lpDisp=GetHtmlDocument();
if(lpDisp)
{
IOleContainer*pContainer;
HRESULThr=lpDisp->QueryInterface(IID_IOleContainer,(void**)&pContainer);
lpDisp->Release();
if(FAILED(hr))
returnhr;
IEnumUnknown*pEnumerator;
//取得列举器
hr=pContainer->EnumObjects(OLECONTF_EMBEDDINGS,&pEnumerator);
pContainer->Release();
if(FAILED(hr))
returnhr;
IUnknown*pUnk;
ULONGuFetched;
//列举并革新一切frame
for(UINTi=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,是对照正轨的办法(可以坚持网页的原始格局)。
BOOLCHtmlView::GetSource(CString&refString)
{
BOOLbRetVal=FALSE;
CComPtr<IDispatch>spDisp=GetHtmlDocument();
if(spDisp!=NULL)
{
HGLOBALhMemory;
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);
LPCTSTRpstr=(LPCTSTR)GlobalLock(hMemory);
if(pstr!=NULL)
{
//StreamisalwaysANSI,butCString
//assignmentoperatorwillconvertimplicitly.
bRetVal=TRUE;
TRY
{
refString=pstr;
}
CATCH_ALL(e)
{
bRetVal=FALSE;
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
if(bRetVal==FALSE)
GlobalFree(hMemory);
else
GlobalUnlock(hMemory);
}
}
}
}
}
returnbRetVal;
}
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|