日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > .NET > 正文

Internet Explorer 編程簡述(八)實現(xiàn)瀏覽歷史菜單

2024-07-21 02:29:33
字體:
供稿:網(wǎng)友

關(guān)鍵字:itravellogstg, ienumtravellogentry, itravellogentry

1、概述

internet explorer的瀏覽歷史菜單在4.0版本開始出現(xiàn),但直到5.5之前,微軟都未公布用于訪問瀏覽歷史的com接口,如今已是ie6.0大行其道的年代,用于訪問瀏覽歷史的接口也早已公布多時,本文的目的則是試圖拋磚引玉,簡單介紹用于訪問瀏覽歷史的travel log接口,并用一個小小的類cietravellog來實現(xiàn)對travel log的封裝。

2、iomhistory接口

在早些時候的msdn中,我們能夠查閱到關(guān)于瀏覽歷史的接口僅有iomhistory,而該接口實際上對應(yīng)的是瀏覽器中可以通過腳本訪問的“history”對象。對于“history”對象,msdn中是這樣說的:

for security reasons, the history object does not expose the actual urls in the browser history. it does allow navigation through the browser history by exposing the back, forward, and go methods. a particular document in the browser history can be identified as an index relative to the current page. for example, specifying -1 as a parameter for the go method is the equivalent of clicking the back button.

this object is available in script as of microsoft internet explorer 3.0.

即為了安全的原因,iomhistory接口僅提供了有限的幾個方法來完成在瀏覽器中前進、后退等操作,并沒有提供訪問歷史列表url的能力。這也難怪,該接口在ie 3.0時代已經(jīng)存在,而當時ie并不成熟,可編程能力也不甚強大。一直到ie 4.0通過與windows 98捆綁銷售一統(tǒng)天下之后,相關(guān)的文檔才逐漸豐富,多窗口瀏覽器等基于internet explorer/webbrowser control的應(yīng)用軟件也才鋪天蓋地開來。但在ie 5.5接口公布之前,要完全模擬ie的travel log行為,并不是一件容易的事。最容易想到的方法就是在beforenavigate、documentcomplete等事件發(fā)生之時記錄/修改url并加以保存(我在早些時候也這樣做過),但是效果不甚理想,尤其是瀏覽包含frame的網(wǎng)頁時,處理更是麻煩。當然,要完全模擬亦非難事,只不過開發(fā)人員都知道微軟公布接口是早晚的事,所以也沒有人花大力氣在模擬ie的travel log行為上。

3、travel log簡介

internet explorer 5.5推出以后,travel log接口也就開始出現(xiàn)在msdn中,它是專門為ole嵌入webbrowser control的應(yīng)用程序設(shè)計的,其目的是“提高和加強用戶的訪問日志體驗”(improve and enhance the user's travel log experience)。事實上,稍后我會提到,travel log接口正日益成為應(yīng)用程序中的重要接口之一。

微軟公布的travel log共包含三個接口:itravellogstg, ienumtravellogentry和itravellogentry。

itravellogstg——該接口提供了用于在travel log中添加、刪除、枚舉日志(瀏覽歷史)的方法,本文需要用到的幾個方法列舉如下:
方法名     用途

enumentries 為訪問日志項創(chuàng)建枚舉器(ienumtravellogentry接口指針)

getrelativeentry 返回一個日志項

travelto 訪問一個日志項

ienumtravellogentry——該接口提供用于枚舉日志項所必需的方法,本文只用到一個方法:
方法名     用途

next   枚舉下一個日志項(返回itravellogentry接口指針)

itravellogentry——該接口只有兩個方法,分別用于返回日志項的title和url:
方法名     用途

gettitle 返回日志項的title

geturl 返回日志項的url

接口準備好了,我們也就很容易得知它們之間的關(guān)系:

要得到相對于當前頁面的日志項列表,首先應(yīng)通過itravellogstg接口創(chuàng)建一個枚舉器(ienumtravellogentry接口)。
通過ienumtravellogentry枚舉器的next方法枚舉出一個個的日志項(itravellogentry接口)。
由itravellogentry接口獲取日志項所代表的網(wǎng)頁的title和url并加以處理。
訪問相對于當前頁面的某個日志項時,首先由itravellogstg的getrelativeentry方法根據(jù)與當前頁的距離得到itravellogentry接口,再將后者傳入itravellogstg的travelto方法以達到訪問日志項的目的(如前進和后退)。

也許不是太恰當,我對uml也不熟悉,借用一個偽uml序列圖表示其關(guān)系如下:

4、封裝travel log

接下來,我們就用一個簡單的類來完成對travel log的封裝。如下所示,tlogstg.h包含了travel log的相關(guān)接口聲明,該頭文件可以在platform sdk中找到。

#include "tlogstg.h"
class cietravellog
{
private:
itravellogstg *m_ptravellogstg;
ienumtravellogentry *m_penumlogentry;
itravellogentry *m_ptravallogentry;
iwebbrowser2* m_pwebbrowser;
public:
cietravellog(void);
~cietravellog(void);
void setwebbrowser(iwebbrowser2* pwebbrowser);
void buildhistorymenu(cmenu * pmenu, unsigned char ncount, bool bforward);
void travelto(int nposition);
};
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的實例
void cietravellog::setwebbrowser(iwebbrowser2* pwebbrowser)
{
if ( (m_pwebbrowser == pwebbrowser) || (m_pwebbrowser == null) )
{
return;
}
if ( m_pwebbrowser != null )
{
m_pwebbrowser->release();
}
m_pwebbrowser = pwebbrowser;
iserviceprovider *psp;
hresult hr = 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();
}
}
//創(chuàng)建瀏覽歷史菜單,bforward指明是前進還是后退菜單
void cietravellog::buildhistorymenu(cmenu * pmenu, unsigned char ncount, bool bforward)
{
if ( m_ptravellogstg == null )
{
return;
}
tlenumf eflag = bforward ? tlef_relative_fore : tlef_relative_back;
if ( failed(m_ptravellogstg->enumentries( eflag, &m_penumlogentry ) ) )
{
return;
}
ulong ufetched;
int i=0;
if ( m_penumlogentry !=null )
{
while ( succeeded( m_penumlogentry->next( 1, &m_ptravallogentry, &ufetched ) ) &&
m_ptravallogentry && i<10 )//我們最多只需要10條歷史菜單,可根據(jù)實際情況修改
{
lpolestr psztitle;
m_ptravallogentry->gettitle( &psztitle );
cstring strtitle = psztitle;
if ( bforward )
{
//id_iehistory_middle是預定義的某個菜單項id,從該id開始前后可以創(chuàng)建10個菜單項,參見下一節(jié)
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();
}
}
}
//根據(jù)與當前頁面的相對距離來訪問歷史網(wǎng)頁
void cietravellog::travelto(int nposition)
{
if ( m_ptravellogstg == null )
{
return;
}
if succeeded(m_ptravellogstg->getrelativeentry( nposition, &m_ptravallogentry ))
{
m_ptravellogstg->travelto( m_ptravallogentry );
}
}

5、使用cietravellog

假設(shè)是在我們自己編寫的多窗口瀏覽器中使用travel log。為簡單起見,我們聲明一個cietravellog的全局對象g_ietravellog,以便在任何地方調(diào)用。然后在適當?shù)牡胤剑鏲mainframe的tbn_dropdown消息(工具條菜單下拉消息)處理函數(shù)ondropdown中,添加下面的代碼,用以創(chuàng)建瀏覽歷史菜單:

//getactivewebbrowserptr返回活動的瀏覽器iwebbrowser2接口指針

ietravellog.setwebbrowser( getactivewebbrowserptr );

//bforward為true則創(chuàng)建“前進”菜單,否則創(chuàng)建“后退”菜單

ietravellog.buildhistorymenu( &menu, 10, bforward);

以下定義為菜單項id的范圍,前后共可以容納10個菜單項,可根據(jù)實際情況修改。

#define id_iehistory_first  60200

#define id_iehistory_middle 60210

#define id_iehistory_last   60220

添加命令處理函數(shù)ontravelhistoryurl用以響應(yīng)從id_iehistory_first到id_iehistory_last的菜單命令。

on_command_range(id_iehistory_first, id_iehistory_last, ontravelhistoryurl)
void cmainframe::ontravelhistoryurl(uint nid /* command id */)
{
//nid - id_iehistory_middle即為要訪問的瀏覽歷史到當前頁面的距離
g_ietravellog.travelto( nid - id_iehistory_middle );
}

6、再談travel log

前面我提到“travel log接口正日益成為應(yīng)用程序中的重要接口之一”,此處加以說明。從微軟平臺的開發(fā)模式及導向來看,基于internet explorer/webbrowser control的應(yīng)用勢必會成為主流。在下一代的操作系統(tǒng)longhorn中,應(yīng)用程序界面的描述將完全由xml的一個特化——xaml來完成,而xaml的解析將由瀏覽器完成。微軟說未來應(yīng)用程序的部署將會十分容易,本地應(yīng)用和基于瀏覽器的應(yīng)用之間的差異將會被逐漸淡化,而實現(xiàn)這一目標的一個重要表現(xiàn)就是,在將來的操作系統(tǒng)平臺上,應(yīng)用程序?qū)嶋H上時刻都將運行在internet explorer中,internet explorer在某種程度上來說變成了一個容器。

于是,扎根于internet explorer的travel log自然而然地就被整合到了我們的應(yīng)用程序中。君不見,我們每天在資源管理器和瀏覽器上完成的工作,不就是在travel log中來來回回地跑嗎?如果所有的應(yīng)用程序都嵌入到internet explorer中運行,那么我們在應(yīng)用程序中所作的操作便自然得到了記錄,“前進”和“后退”也就很easy了。

很多軟件都已經(jīng)或多或少地開始采用基于internet explorer的模式,如microsoft money、microsoft encarta、visual studio.net的安裝程序等等,都是很好的范例。所以,就目前來說,將我們的應(yīng)用程序按這種模式編寫(可參考《利用瀏覽器實現(xiàn)程序界面與實現(xiàn)的分離》),不是可以早一點獲得“訪問日志的體驗”嗎?何樂而不為。

  • 本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    亚洲综合欧美在线| 99pao成人国产永久免费视频| a视频免费在线观看| 日韩欧美中文字幕公布| 国产黄色在线播放| 亚洲乱码中文字幕综合| 不卡一区2区| 中文字幕国产在线| 欧美日韩精品中文字幕| 99精品在线播放| 欧美久久综合性欧美| 久久精品欧美日韩精品| 国产导航在线| 欧美日韩中文字幕视频| 国产在线看一区| 高清一区二区| 日韩精品一级| 国产一区高清视频| 国产在线黄色片| 国产v日产∨综合v精品视频| 日韩精品在线中文字幕| 婷婷精品进入| 日韩a一区二区| 亚洲高清在线观看一区| 欧美亚洲专区| 日韩一级精品| 欧美日韩精品是欧美日韩精品| 亚洲欧洲日产国码av系列天堂 | 日韩视频1区| 国产一级在线| 日本xxxwww免费视频| 国产丝袜欧美中文另类| 91久久久精品| 在线不卡一区二区| 欧美亚洲天堂网| 欧美日韩国产亚洲一区| 精品婷婷伊人一区三区三| 国产在线精品日韩| 精品国产99| 国产一级视频在线播放| 日韩精品a在线观看91| 视频一区二区不卡| 中文字幕欧美日韩精品| 色99中文字幕| 91日韩欧美| 欧美三级在线播放| 午夜亚洲一区| 欧美日韩在线第一页| 欧美日韩国产首页| 午夜亚洲一区| 精品av中文字幕在线毛片| 国产嫩草影院久久久久| 欧美日韩国产免费观看| 一本大道一区二区三区| 亚洲视频在线观看日本a| 国产久卡久卡久卡久卡视频精品| 中文官网资源新版中文第二页在线观看| 深夜福利亚洲| 蜜桃精品视频| 国产调教精品| 精品区一区二区| 日韩中文字幕在线播放| 黄色国产在线| 91精品综合久久| 91精品国产综合久久久蜜臀粉嫩| 日韩精品一页| 国产小视频免费在线网址| 日韩精品视频网站| 1024国产在线| 日本中文字幕在线观看| 欧美不卡视频| 国产对白在线| 欧美日韩国产第一页| 欧美一级免费观看| 久久精品一二三| 国产在线导航| 九九精品调教| 91精品国产网站| 午夜av一区| 91精品久久久久久久久久入口| 欧美日韩国产专区| 亚洲羞羞网站| 日韩三级视频中文字幕| 欧美日韩中文字幕在线视频| 欧美xxxx中国| 日本xxxwww免费视频| 亚洲第一视频网站| av中文在线播放| 国产欧美日韩三级| 亚洲小说春色综合另类网蜜桃| 欧美激情视频一区二区三区在线播放| 黄色精品在线观看| 久久婷婷国产| 日韩精品在线私人| 一区二区不卡视频在线观看| 国产91大片| 欧美日韩三级视频| 国产欧美三级| 97视频在线| 日韩在线中文视频| 日韩欧美一卡二卡| 97国产视频| 日韩不卡一二区| 国产成人精品免费网站| 日本亚洲欧美| 在线不卡一区二区| 日韩欧美一二三区| 免费精品国产自产拍观看| 婷婷精品进入| 日韩精品第一区| 午夜国产福利在线观看| 欧美久久久久久蜜桃| 中文字幕国产日韩| 免费在线观看国产黄| 91精品国产全国免费观看| 91精品日本| 国产高清一级片| 精品久久九九| 亚洲高清精品视频| 91精品久久久久久久91蜜桃| 日韩视频免费直播| 欧美日韩午夜在线| 欧美日韩国产首页| 精品日韩视频在线观看| 一区二区三区精品99久久| 国产午夜在线观看| 91精品国产调教在线观看| 黄色片免费看| 99久久婷婷| 中文字幕精品一区二| 久久99精品久久久久子伦 | av免费观看国产| 91精品久久久久久久久| 久久99久久99精品中文字幕 | 欧美日韩国产免费| 日韩国产一区久久| 国产欧美日韩中文字幕| 国产最新在线| 精品久久电影| 日韩中文在线视频| 91色在线看| 中文字幕在线精品| 日韩视频中文字幕| 国产在线一在线二| 国产成人精品三级| 国产欧美久久久久久久久| 二区中文字幕| 中文字幕日韩欧美| 91精品国产91久久| 日韩免费高清一区二区| av免费在线播放| 国产在线欧美| 日韩中文字幕在线播放| 国产欧美日韩精品综合| 国产婷婷色一区二区三区| 久久精品99久久久久久久久 | 欧美片网站免费| www.中文字幕在线| 视频一区视频二区中文| 中文字幕精品一区二区三区在线 | 日韩亚洲欧美中文字幕| 在线日韩精品视频| 最新中文字幕在线| 91久久精品国产91性色69| 中文字幕日韩精品在线| 中文字幕4区| 日韩中文字幕亚洲| 91精品国产综合久久蜜臀| 亚洲欧美中文字幕在线观看| 日韩欧美亚洲日产国| 国产婷婷色一区二区三区在线| 国产一卡二卡3卡4卡四卡在线| 天天综合日日夜夜精品| 日韩中文字幕| 亚洲第一视频| 国产一级在线免费观看| 欧美一级欧美三级在线观看| 欧美日韩国产三级| 亚洲第一视频在线观看| 国产欧美日韩综合| 99在线国产| 日韩在线视频观看正片免费网站| 久久精品电影| 日本a口亚洲| 91久久精品午夜一区二区| 亚洲午夜av| 日韩欧美在线看| 日韩av中文字幕一区| 日韩欧美色综合网站| 久久精品网站免费观看| 色欧美日韩亚洲| 91精品国产综合久久蜜臀| 久久99久久久久久久噜噜| 日韩精品在线视频观看| 欧美日韩精品中文字幕| 亚洲欧洲精品在线| 国产最新在线| 亚洲欧美伊人| 91精品999| 亚洲三级欧美| 国产高清一区| 欧美专区中文字幕| 中文字幕高清在线播放| 日韩精品在线私人| 国产成免费视频| 日韩福利视频导航| 深夜福利一区二区| 欧美日韩在线播放三区四区| 国产亚洲视频中文字幕视频| 国产日韩精品在线| 中文字幕国产日韩| 午夜黄色小视频| 中文字幕亚洲国产| 91蜜桃在线视频| 日韩欧美国产高清91| 国产三级视频网站| 亚洲欧洲日韩在线| 国产欧美一级| 在线黄色国产电影| 欧美日韩性视频一区二区三区| 中文字幕五月欧美| 久久视频一区| aaa大片在线观看| 欧美日韩中文在线| 91久久在线| 亚洲欧美日本国产专区一区| 日韩免费高清一区二区| 91精品久久久久久蜜臀| 亚洲免费观看视频| 91精品日本| 国产视频一区三区| 日韩激情一区| 国产视频2区| www在线视频| 久久精品最新免费国产成人| 中文字幕精品亚洲| 一区二区精品区| 中文字幕在线高清| 91精品国产91久久久久久三级| 国产日韩av高清| 国产一级久久久| 国产一级一片免费播放| 日韩亚洲不卡在线| av免费看在线| 欧美在线观看视频一区| 在线中文字幕视频观看| 欧美日韩一二三四| 欧美成人一区二区| 欧美三级中文字幕| 国产最新在线| 欧美91精品| 国产美女主播视频一区| 91精品国产入口| 中文字幕精品一区二| 久久99精品久久久久子伦| 国产在线黄色片| 精品亚洲成a人片在线观看| 免费国产h视频在线观看86| 日韩视频免费直播| 日韩欧美国产黄色| 欧美日韩国产黄色| 日韩欧美专区在线| 亚洲一区在线观看免费| 日韩在线视频观看正片免费网站| 黄色资源在线观看| 久久香蕉精品| 欧美在线亚洲一区| 91精品xxx在线观看| 中文字幕不卡三区| 欧美中文字幕精品| 日韩免费视频一区| 久久精品国产91精品亚洲| 亚洲综合在线不卡| 日韩欧美一级在线| 日韩视频免费直播| 国产欧美日韩91| 九九视频精品免费| 亚洲羞羞网站| 欧美日韩国产91| 久久福利视频一区二区| 国产黄在线看| 国产999在线观看| 首页国产欧美久久| 精品亚洲永久免费| av亚洲免费| 在线观看免费国产小视频| 一级特黄aaa大片在线观看| 欧美日韩高清| 91久久久精品国产| 亚洲一卡二卡在线观看| 欧美日韩国产一区在线| 日韩精品一二三四区| 先锋男人资源站| 日韩久久在线| 91精品国产综合久久久蜜臀粉嫩| 亚洲三级国产| 亚洲开心激情| 日韩免费电影网站| 91久久中文| 91日韩中文字幕| 亚洲高清精品视频| 91麻豆免费视频网站| 99视频在线看| 午夜国产福利一区二区| wwwwww国产| 中文国产字幕在线观看| 在线手机中文字幕| 精品免费视频| www.久久草| 二区视频在线观看| 国产中文在线视频| 日韩av中文字幕一区| 日韩欧美国产不卡| 欧美日韩人人澡狠狠躁视频| 欧美日韩国产首页| 中文字幕无线码一区| 在线观看av的网站| 亚洲欧美中文字幕在线一区| 中文字幕视频在线免费欧美日韩综合在线看| 视频一区日韩| 欧美日韩中文字幕在线| 日韩在线视频网| av首页在线| 欧美日韩国产第一页| 国产一卡2卡3卡免费网站| 日韩欧美在线网址| 欧美 日韩 国产在线| 正在播放日韩精品| 日韩欧美中文视频| 91亚洲国产| 国产一级久久久| 国产欧美日韩不卡| 亚洲女人天堂a在线播放| 91久久在线| 精品国产欧美日韩不卡在线观看| 中文天堂资源在线| 国产又粗又猛又爽又黄91精品| 午夜国产福利一区二区| 国产一区日韩| 中文在线第一页| 欧美日韩精品高清| 欧美日韩一二三四| 一本大道一区二区三区| 国产亚洲欧美中文| 欧美不卡视频一区发布| 亚洲一区在线观看免费| 中文字幕在线视频久| 日韩中文字幕在线观看视频| 一区二区视频在线| av免费不卡国产观看| 中文字幕 欧美日韩| 精品激情国产视频| 欧美三级视频在线| 精品久久久精品| 日韩欧美国产免费播放| 国产偷国产偷亚洲清高网站| 日韩精品一级| 亚洲成年人影院在线| 不卡中文一二三区| 一级片在线免费看| 国产乱国产乱老熟300部视频| 日韩欧美国产视频| 国产成人精品免费久久久久| 亚洲高清中文字幕| 亚洲欧美999| 日韩亚洲欧美中文字幕| 国产乱一区二区| 一级片在线免费看| 亚洲a中文字幕| 国产成免费视频| 欧美日韩在线综合| 日韩精品一二三四区| 中文字幕亚洲视频| 国产嫩草影院久久久久| 亚洲羞羞网站| 亚洲高清中文字幕| 亚洲高清视频一区| 福利在线国产| 中文字幕久精品免费视频| 国产成人精品三级| www.中文字幕在线| 国产一二三视频| 国产91欧美| 91精品国产入口| 国产中文在线视频| 精品网站999www| 日韩欧美中文在线视频| 亚洲国产福利| 国产在线视频不卡| 在线日韩欧美| 欧美日韩高清一区二区| 亚洲一区二区三区精品中文字幕| 欧美日中文字幕| 欧美日韩高清不卡| 日韩激情一区| 亚洲国产欧美91| 中文字幕在线观看亚洲| 中文字幕精品一区二区三区在线| 日韩精品在线网站| 久久人人88|