分享
 
 
 

用Socket和MSHTML对象模型创建自己的浏览器

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用Socket和MSHTML对象模型创建自己的浏览器

中央财经大学管理信息系 薛 瑛

01-4-20 上午 11:15:22

HTTP协议和WEB浏览器的诞生给我们的网络增加了更多的精彩。但在实际应用中我们可能会有不同的需要而不是单纯的使用浏览器,譬如在我们的应用程序中加入浏览互联网的功能。微软的ChtmlView类很方便的实现了网页浏览。但是它很不灵活,无法使用户动态地在网页上修改自己想要的元素。本文探讨一些方法使用Socket传输Html文档,利用微软的动态MSHTML对象模型实现一些浏览器的内部机制。

大家知道HTML文档是由标记语言构成,即俗称的Tag。微软的浏览器IE对于这些标记实现了一一对应的对象模型(objectmodel),由MSHTML.DLL封装。IE浏览器的实现也是由MSHTML.DLL来实现的。通过MSHTML.DLL我们可以直接操作对象模型的属性,方法。MSHTML的对象模型是基于COM组件对象的,对象的接口是基于Idispatch,操作MSHTML对象模型必须通过Idispatch接口。MSHTML中封装了许多这样的接口,例如,IhtmlAnchorElement接口对应与HTML文档中的超连接标记<A>,IHtmlHRElement接口对应<HR>标记,IhtmlTable接口对应<table>标记。其中最重要的是IhtmlDocument2接口,它对应Document组件。Document组件既相当于HTML文档。使用过Javascript的人对它应比较熟悉。

下面我们举例来讲解MSHTML的应用。在举例之前我先讲述一下Socket和HTTP协议。HTTP协议通过TCP连接服务器和Client,它工作在80端口。HTTP通过Client和Server之间的请求/应答机制进行通讯。HTTP消息分为Request和Response。每一种消息由开始行,消息头和消息体组成。形式如下:

generic-message = start-line

*message-header

CRLF

[ message-body ]

start-line的形式如下:

start-line = Request-Line | Status-Line

Request-Line为Client向Server发出的请求,形式如下:

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

Method 包括GET,POST等,在本例中我们只简单的使用GET向服务器发出请求。

详细的HTTP协议请参考RFC2068。

在VC++中建立新的单文档EXE工程文件,为了使用MSHTML我们的视图类继承自ChtmlView。ChtmlView类封装了MSHTML接口。给工程中加入Socket类。

class CHttpSocket : public CSocket

{

………………

protected:

CWnd * m_pParentWnd;

}

其中m_pParentWnd指向我们的视图类,用于传送消息。在视图类中定义Socket。

class CSkhttpView : public CHtmlView

{

protected: // create from serialization only

CSkhttpView();

DECLARE_DYNCREATE(CSkhttpView)

…………….

protected:

CHttpSocket m_socket;

IHTMLDocument2 * phmDoc2;

……..

}

phmDoc2为IHTMLDocument2接口。初始化Socke,连接我们欲登录的站点,假设为www.163.net。

CSkhttpView::CSkhttpView()

{

// TODO: add construction code here

BOOL bRet=m_socket.Create(0,SOCK_STREAM,NULL);

if(!bRet)

MessageBox("socket create error",NULL,MB_OK);

m_socket.SetParentWnd(this);

if(!m_socket.Connect(www.163.net,80))

MessageBox(“socket connect error”,NULL,MB_OK);

}

下面我们取得IhtmlDocument2的接口。此接口的获得一般有两种方法。一是使用CoCreateInstance,然后调用QueryInterface。另一种是使用MSHTML控件对象的get_Document,在ChtmlView类中封装了这个接口。我们使用后一种。需要注意的是,我们需要在ChtmlView生成IhtmlDocument对象后才能获得它的接口。

void CSkhttpView::OnInitialUpdate()

{

Navigate2(“about:blank”);

}

void CSkhttpView::OnDocumentComplete(LPCTSTR lpszURL)

{

LPDISPATCH lpdisp;

HRESULT hr;

lpdisp=GetHtmlDocument();

hr=lpdisp->QueryInterface(IID_IHTMLDocument2,(void **)&phmDoc2);

}

在ChtmlView初始化时调用Navigate2()产生空文档,文档产生后调用GetHtmlDocument获得一个Idispatch()接口,调用QueryInterface获得IHTMLDocument2接口。

void CSkhttpView::OnReceiveMessage(WPARAM wParam,LPARAM lParam)

{

HRESULT hr;

char buf[5000];

int inum;

IHTMLElement * pEleBody;

if(wParam==0)

{

inum=m_socket.Receive(buf,sizeof(buf),0);

buf[inum]=0;

_bstr_t bsrBody(buf);

hr=phmDoc2->get_body(&pEleBody);

hr=pEleBody->put_innerHTML(bsrBody);

}

}

void CSkhttpView::OnControlSend()

{

// TODO: Add your command handler code here

char buf[1000];

wsprintf(buf,"GET http://www.163.net HTTP/1.1\r\n\r\n");

int iRet=m_socket.Send(buf,lstrlen(buf),0);

if(iRet==SOCKET_ERROR)

MessageBox(“socket send error”,NULL,MB_OK);

}

我们向服务器发送HTTP协议的请求”GET http://www.163.net HTTP/1.1\r\n\r\n”,它取回指定URI地址的网页。服务器发出回应我们通过Socket接受。IhtmlDocument2内含许多对象借口,通过许多的put_,get_方法我们可以获得这些对象的属性,事件,方法。本例中我们获得body对象,它对应于HTML文挡中<body></body>对象。通过IhtmlDocument2的get_body()得到指定body对象的IHTMLElement接口,调用IHTMLElement接口的put_innerHTML()将接受到的内容放入Document中。此时在我们的视图中就会显示网页。

本文只是简略的介绍了一下MSHTML对象,它里面实际包含了许多的接口和函数,通过这些接口我们可以任意设计我们自己风格的浏览器。有兴趣的同志可以参阅MSDN文档。

(网页编辑:徐向阳

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有