仓酷云 发表于 2015-1-16 22:34:59

ASP.NET教程之两种办法会见多层嵌套的frame

不过你如果学.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;
}
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。

分手快乐 发表于 2015-1-19 17:45:07

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

若天明 发表于 2015-1-26 22:23:35

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

仓酷云 发表于 2015-2-10 12:19:13

那么,ASP.Net有哪些改进呢?

小妖女 发表于 2015-3-1 10:42:11

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

小女巫 发表于 2015-3-10 15:48:34

可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。

变相怪杰 发表于 2015-3-17 08:48:53

有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。

因胸联盟 发表于 2015-3-24 04:36:41

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
页: [1]
查看完整版本: ASP.NET教程之两种办法会见多层嵌套的frame