仓酷云

标题: ASP.NET网页编程之Internet Explorer 编程简述(八)完成... [打印本页]

作者: 柔情似水    时间: 2015-1-16 22:34
标题: ASP.NET网页编程之Internet Explorer 编程简述(八)完成...
在CSDN里搜索一下“初学”两字,竟有三百余篇帖子(也许更多)。有些帖子说,有了asp的基础,只要15天就能很熟悉了,我甚感自己的愚钝。更多帖子是向大家请教初学者适合看书。两个多月的时间(当然平常杂事比较多。编程|菜单关头字:ITravelLogStg,IEnumTravelLogEntry,ITravelLogEntry
1、概述
InternetExplorer的扫瞄汗青菜单在4.0版本入手下手呈现,但直到5.5之前,微软都未发布用于会见扫瞄汗青的COM接口,现在已经是IE6.0年夜行其道的年月,用于会见扫瞄汗青的接口也早已发布多时,本文的目标则是试图举一反三,复杂先容用于会见扫瞄汗青的TravelLog接口,并用一个小小的类CIETravelLog来完成对TravelLog的封装。
2、IOmHistory接口
在早些时分的MSDN中,我们可以查阅到关于扫瞄汗青的接口唯一IOmHistory,而该接话柄际上对应的是扫瞄器中能够经由过程剧本会见的“history”工具。关于“history”工具,MSDN中是如许说的:
Forsecurityreasons,thehistoryobjectdoesnotexposetheactualURLsinthebrowserhistory.Itdoesallownavigationthroughthebrowserhistorybyexposingtheback,forward,andgomethods.Aparticulardocumentinthebrowserhistorycanbeidentifiedasanindexrelativetothecurrentpage.Forexample,specifying-1asaparameterforthegomethodistheequivalentofclickingtheBackbutton.
ThisobjectisavailableinscriptasofMicrosoftInternetExplorer3.0.
即为了平安的缘故原由,IOmHistory接口仅供应了无限的几个办法来完成在扫瞄器中行进、前进等操纵,并没有供应会见汗青列表Url的才能。这也难怪,该接口在IE3.0时期已存在,而事先IE其实不成熟,可编程才能也不甚壮大。一向到IE4.0经由过程与Windows98绑缚发卖金瓯无缺以后,相干的文档才渐渐丰厚,多窗口扫瞄器等基于InternetExplorer/WebBrowserControl的使用软件也才漫山遍野开来。但在IE5.5接口发布之前,要完整摹拟IE的TravelLog举动,并非一件简单的事。最简单想到的办法就是在BeforeNavigate、DocumentComplete等事务产生之时纪录/修正Url并加以保留(我在早些时分也如许做过),可是效果不甚幻想,特别是扫瞄包括Frame的网页时,处置更是贫苦。固然,要完整摹拟亦谴责事,只不外开辟职员都晓得微软发布接口是日夕的事,以是也没有人花鼎力气在摹拟IE的TravelLog举动上。
3、TravelLog简介
InternetExplorer5.5推出今后,TravelLog接口也就入手下手呈现在MSDN中,它是专门为OLE嵌进WebBrowserControl的使用程序计划的,其目标是“进步和增强用户的会见日记体验”(improveandenhancetheuserstravellogexperience)。现实上,稍后我会提到,TravelLog接口正日趋成为使用程序中的主要接口之一。
微软发布的TravelLog共包括三个接口:ITravelLogStg,IEnumTravelLogEntry和ITravelLogEntry。
ITravelLogStg――该接口供应了用于在TravelLog中增加、删除、列举日记(扫瞄汗青)的办法,本文必要用到的几个办法枚举以下:
办法名用处
EnumEntries为会见日记项创立列举器(IEnumTravelLogEntry接口指针)
GetRelativeEntry前往一个日记项
TravelTo会见一个日记项
IEnumTravelLogEntry――该接口供应用于列举日记项所必须的办法,本文只用到一个办法:
办法名用处
Next列举下一个日记项(前往ITravelLogEntry接口指针)
ITravelLogEntry――该接口只要两个办法,分离用于前往日记项的Title和Url:
办法名用处
GetTitle前往日记项的Title
GetURL前往日记项的Url
接口筹办好了,我们也就很简单得知它们之间的干系:
要失掉相对以后页面的日记项列表,起首应经由过程ITravelLogStg接口创立一个列举器(IEnumTravelLogEntry接口)。
经由过程IEnumTravelLogEntry列举器的Next办法列举出一个个的日记项(ITravelLogEntry接口)。
由ITravelLogEntry接口猎取日记项所代表的网页的Title和Url并加以处置。
会见相对以后页面的某个日记项时,起首由ITravelLogStg的GetRelativeEntry办法依据与以后页的间隔失掉ITravelLogEntry接口,再将后者传进ITravelLogStg的TravelTo办法以到达会见日记项的目标(如行进和前进)。
大概不是太得当,我对UML也不熟习,借用一个伪UML序列图暗示其干系以下:
ASP.NET网页编程之Internet Explorer 编程简述(八)完成...
登录/注册后可看大图

4、封装TravelLog
接上去,我们就用一个复杂的类来完成对TravelLog的封装。以下所示,tlogstg.h包括了TravelLog的相干接口声明,该头文件能够在PlatformSDK中找到。
#include"tlogstg.h"
classCIETravelLog
{
private:
ITravelLogStg*m_pTravelLogStg;
IEnumTravelLogEntry*m_pEnumLogEntry;
ITravelLogEntry*m_pTravalLogEntry;
IWebBrowser2*m_pWebBrowser;
public:
CIETravelLog(void);
~CIETravelLog(void);
voidSetWebBrowser(IWebBrowser2*pWebBrowser);
voidBuildHistoryMenu(CMenu*pMenu,unsignedcharnCount,boolbForward);
voidTravelTo(intnPosition);
};
CIETravelLog::CIETravelLog(void)
:m_pTravelLogStg(NULL),m_pEnumLogEntry(NULL),m_pTravalLogEntry(NULL),m_pWebBrowser(NULL)
{
}
CIETravelLog::~CIETravelLog(void)
{
if(m_pTravelLogStg!=NULL)
{
m_pTravelLogStg->Release();
}
if(m_pEnumLogEntry!=NULL)
{
m_pEnumLogEntry->Release();
}
if(m_pTravalLogEntry!=NULL)
{
m_pTravalLogEntry->Release();
}
if(m_pWebBrowser!=NULL)
{
m_pWebBrowser->Release();
}
}
//将扫瞄器的IWebBrowser2接口指针付与CIETravelLog的实例
voidCIETravelLog::SetWebBrowser(IWebBrowser2*pWebBrowser)
{
if((m_pWebBrowser==pWebBrowser)||(m_pWebBrowser==NULL))
{
return;
}
if(m_pWebBrowser!=NULL)
{
m_pWebBrowser->Release();
}
m_pWebBrowser=pWebBrowser;
IServiceProvider*pSP;
HRESULThr=m_pWebBrowser->QueryInterface(IID_IServiceProvider,(LPVOID*)&pSP);
m_pWebBrowser->Release();
if(SUCCEEDED(hr))
{
hr=pSP->QueryService(SID_STravelLogCursor,IID_ITravelLogStg,(LPVOID*)&m_pTravelLogStg);
pSP->Release();
}
}
//创立扫瞄汗青菜单,bForward指明是行进仍是前进菜单
voidCIETravelLog::BuildHistoryMenu(CMenu*pMenu,unsignedcharnCount,boolbForward)
{
if(m_pTravelLogStg==NULL)
{
return;
}
TLENUMFeFlag=bForward?TLEF_RELATIVE_FORE:TLEF_RELATIVE_BACK;
if(FAILED(m_pTravelLogStg->EnumEntries(eFlag,&m_pEnumLogEntry)))
{
return;
}
ULONGuFetched;
inti=0;
if(m_pEnumLogEntry!=NULL)
{
while(SUCCEEDED(m_pEnumLogEntry->Next(1,&m_pTravalLogEntry,&uFetched))&&
m_pTravalLogEntry&&i<10)//我们最多只必要10条汗青菜单,可依据实践情形修正
{
LPOLESTRpszTitle;
m_pTravalLogEntry->GetTitle(&pszTitle);
CStringstrTitle=pszTitle;
if(bForward)
{
//ID_IEHISTORY_MIDDLE是预界说的某个菜单项ID,从该ID入手下手前后能够创立10个菜单项,拜见下一节
pMenu->InsertMenu(0,MF_STRING,ID_IEHISTORY_MIDDLE+++i,strTitle);
}
else
{
pMenu->InsertMenu(0,MF_STRING,ID_IEHISTORY_MIDDLE-++i,strTitle);
}
CoTaskMemFree(pszTitle);
m_pTravalLogEntry->Release();
}
}
}
//依据与以后页面的绝对间隔来会见汗青网页
voidCIETravelLog::TravelTo(intnPosition)
{
if(m_pTravelLogStg==NULL)
{
return;
}
ifSUCCEEDED(m_pTravelLogStg->GetRelativeEntry(nPosition,&m_pTravalLogEntry))
{
m_pTravelLogStg->TravelTo(m_pTravalLogEntry);
}
}
5、利用CIETravelLog
假定是在我们本人编写的多窗口扫瞄器中利用TravelLog。为复杂起见,我们声明一个CIETravelLog的全局工具g_IETravelLog,以便在任何中央挪用。然后在得当的中央,如CMainFrame的TBN_DROPDOWN动静(工具条菜单下拉动静)处置函数OnDropDown中,增加上面的代码,用以创立扫瞄汗青菜单:
//GetActiveWebBrowserPtr前往举动的扫瞄器IWebBrowser2接口指针
IETravelLog.SetWebBrowser(GetActiveWebBrowserPtr);
//bForward为true则创立“行进”菜单,不然创立“前进”菜单
IETravelLog.BuildHistoryMenu(&Menu,10,bForward);
以下界说为菜单项ID的局限,前后共能够包容10个菜单项,可依据实践情形修正。
#defineID_IEHISTORY_FIRST60200
#defineID_IEHISTORY_MIDDLE60210
#defineID_IEHISTORY_LAST60220
增加命令处置函数OnTravelHistoryUrl用以呼应从ID_IEHISTORY_FIRST到ID_IEHISTORY_LAST的菜单命令。
ON_COMMAND_RANGE(ID_IEHISTORY_FIRST,ID_IEHISTORY_LAST,OnTravelHistoryUrl)
voidCMainFrame::OnTravelHistoryUrl(UINTnID/*CommandID*/)
{
//nID-ID_IEHISTORY_MIDDLE即为要会见的扫瞄汗青到以后页面的间隔
g_IETravelLog.TravelTo(nID-ID_IEHISTORY_MIDDLE);
}
6、再谈TravelLog
后面我提到“TravelLog接口正日趋成为使用程序中的主要接口之一”,此处加以申明。从微软平台的开辟形式及导一直看,基于InternetExplorer/WebBrowserControl的使用必将会成为支流。鄙人一代的操纵体系Longhorn中,使用程序界面的形貌将完整由XML的一个特化――XAML来完成,而XAML的剖析将由扫瞄器完成。微软说将来使用程序的部署将会非常简单,当地使用和基于扫瞄器的使用之间的差别将会被渐渐淡化,而完成这一方针的一个主要体现就是,在未来的操纵体系平台上,使用程序实践上时候都将运转在InternetExplorer中,InternetExplorer在某种水平下去说酿成了一个容器。
因而,扎根于InternetExplorer的TravelLog天然而然地就被整合到了我们的使用程序中。君不见,我们天天在资本办理器和扫瞄器上完成的事情,不就是在TravelLog中来往返回地跑吗?假如一切的使用程序都嵌进到InternetExplorer中运转,那末我们在使用程序中所作的操纵便天然失掉了纪录,“行进”和“前进”也就很Easy了。
良多软件都已或多或少地入手下手接纳基于InternetExplorer的形式,如MicrosoftMoney、MicrosoftEncarta、VisualStudio.net的安装程序等等,都是很好的典范。以是,就今朝来讲,将我们的使用程序按这类形式编写(可参考《使用扫瞄器完成程序界面与完成的分别》),不是能够早一点取得“会见日记的体验”吗?何乐而不为。
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。
作者: 不帅    时间: 2015-1-19 17:45
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
作者: 小妖女    时间: 2015-1-25 15:35
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
作者: 若天明    时间: 2015-2-2 22:37
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
作者: 山那边是海    时间: 2015-2-8 18:40
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
作者: 变相怪杰    时间: 2015-2-25 22:40
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
作者: 只想知道    时间: 2015-3-8 09:12
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
作者: 再现理想    时间: 2015-3-15 21:35
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
作者: 灵魂腐蚀    时间: 2015-3-22 05:09
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
作者: 飘飘悠悠    时间: 2015-3-22 05:09
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2