IE浏览器架构 | Internet Explorer Architecture

IE架构是基于COM的,这点保证了其复用性和拓展性

To choose the most appropriate reuse or extension mechanism for your needs, it is first important to understand Internet Explorer’s architecture. Essential to the browser’s architecture is the use of the Component Object Model (COM), which governs the interaction of all of its components and enables component reuse and extensibility. The following diagram illustrates Internet Explorer’s major components.


分为6个组件,如下图:

A description of each of these six components follows:

       


1.IExplorer.exe,是架构的最顶层,是一个可执行程序。

1.IExplore.exe is at the top level, and is the Internet Explorer executable.

   它很小,依赖其他主要IE组件,完成渲染、向导、协议实现等等工作。

It is a small application that relies on the other main components of Internet Explorer to do the work of rendering, navigation, protocol implementation, and so on.


2.Browsui.dll,提供用户界面,通常被称为“chrome”,包含地址栏、状态栏、菜单等等。

2.Browsui.dll provides the user interface to Internet Explorer. Often referred to as the "chrome," this DLL includes the Internet Explorer address bar, status bar, menus, and so on.


3.Shdocvw.dll,提供导航和历史功能,通常被称为“Web浏览器控件”。

3.Shdocvw.dll provides functionality such as navigation and history, and is commonly referred to as the WebBrowser control.

   该DLL基于活动控件接口,使在窗口应用程序在VB、MFC、ATL或.NET等框架中使用该DLL容易。

This DLL exposes ActiveX Control interfaces, enabling you to easily host the DLL in a Windows application using frameworks such as Microsoft Visual Basic, Microsoft Foundation Classes (MFC), Active Template Library (ATL), or Microsoft .NET Windows Forms.

   当你的应用程序使用该Web浏览器控件时,它包含IE除了界面的所有功能,就是说你要自己提供界面实现。

When your application hosts the WebBrowser control, it obtains all the functionality of Internet Explorer except for the user interface provided by Browseui.dll. This means that you will need to provide your own implementations of toolbars and menus.


4.Mshtml.dll,负责CSS解析和渲染。

4.Mshtml.dll is at the heart of Internet Explorer and takes care of its HTML and Cascading Style Sheets (CSS) parsing and rendering functionality.

   通常被称作“Trident”。

Mshtml.dll is sometimes referred to by its code name, "Trident".

   该DLL基于活动文档接口,Word、Excel、Visio和其他许多非微软应用程序也基于此接口,所以它们也可以用shdocvw.dll承载。

Mshtml.dll exposes interfaces that enable you to host it as an active document. Other applications such as Microsoft Word, Microsoft Excel, Microsoft Visio, and many non-Microsoft applications also expose active document interfaces so they can be hosted by shdocvw.dll.

   比如,当用户浏览从HTML页面到Word文档时,mshtml.dll被Wrod的渲染文档DLL替换掉。

For example, when a user browses from an HTML page to a Word document, mshtml.dll is swapped out for the DLL provided by Word, which then renders that document type.

   Mshtml.dll中可能会被要求承载其他依赖于HTML文档内容的组件,如脚本引擎(如JScript、VBScript),ActiveX控件,XML数据等。

Mshtml.dll may be called upon to host other components depending on the HTML document’s content, such as scripting engines (for example, Microsoft JScript or Visual Basic Scripting Edition (VBScript)), ActiveX controls, XML data, and so on.


5.Urlmon.dll,提供MIME处理和程序下载功能

5.Urlmon.dll offers functionality for MIME handling and code download.


6.WinInet.dll,负责处理Windows互联网协议,实现了HTTP和FTP以及缓存管理。

6.WinInet.dll is the Windows Internet Protocol handler. It implements the HTTP and File Transfer Protocol (FTP) protocols along with cache management.

原文地址(MSDN)

问:算法的计算量的大小称为计算的?

这是一道题

算法的计算量的大小称为计算的()

A.效率          B. 复杂性       C. 现实性           D. 难度

答案是B

如果我在考试,或者我在做题,或者更具体来讲在做选择题,我想我会选择B。

思路是这样的:

首先,我会看四个答案,分别说的啥。

A 效率,算法的计算量的大小称为计算的效率。前后简直说的不是一个东西,效率是效率,怎么是种度量呢?算法的度量不是看时间复杂度和空间复杂度的吗!?不是

B 复杂性,算法的计算量的大小称为计算的复杂性。怪怪的,“大小称为复杂性”,好像语句不通似的,不是

C 现实性,算法的计算量的大小称为计算的现实性。太现实了吧?这句话更抽象了,不是

D 难度,算法的计算量的大小称为计算的难度。好像有点意思,至少语句是通顺了,但是,又和心里的答案:“复杂度”差了2个字,很纠结,再看看前面的吧~

A、C扯的太远,B 虽然语句不通,但是和“复杂度”之差了1个字,D 虽然语句通顺,但是没有B 的匹配度高。

最后,心里很纠结……的选个B

====总结====

考试和解决实际问题,最大的区别就在于:考试,不能用正常的思维(生活、实践、经验、常识)来思考,而解决实际问题需要

考试,你就要遵守考试的游戏规则。考试的时候,你不能有自己的观点,仔细观察,用于规范的选择题,从来都是说,请选择一个最佳答案。如果4个答案都沾边,你就要选择一个匹配度最高的(就像上面这道题)。最有趣(最没意义)的情况是,题出错了,你还必须猜测出题人的意图,选一个他认为,或者他本来想考你的答案,呵呵

总之,考试这种东西,对我来说太复杂,以书此文,表达我对学霸无限的仰慕之情,以及抒发希望和考试这种事情井水不犯河水的小小情怀

有经验和没经验的程序员的区别

最大的区别不是编码速度,也不是代码技巧,而是对分析问题的角度

1.编码速度

其实每个人差别都不大,有些人擅长cut and copy,有些人擅长hard code,有些人擅长algorithm desing,有些人擅长design pattern。不管用哪种方法,都能够实现一个功能,只要脑子里想好怎么做了,它们之间速度的差异,基本就是打字速度的差异。(其差异不在速度,而在于维护性)

2.代码技巧

一类是编码习惯上的,比如:循环次数多的,要放在内层;判断一个变量是否为空,null写在等号左边;一类算法运用上的,比如:求两个数的最大公约数,最方便的方法是辗转相除法;比如求第10000个质数,在尝试除以自己的约数的时候,只用试到自身的二次根。(这有点像是算法,但之所以我没有把它认为成算法,是因为这些东西已经是定式,不用再花脑子去想,)这些东西,其实都是“见面会”,只要你见过,就会用,有经验的程序员会,没经验的也可能会~

3.分析问题的角度

3.1.有经验,能更快,更准的发现问题

有没有这种体会,刚编程时,经常会遇到“非常奇怪的问题”,“奇怪,我明明是按照书上的方法写的,为什么结果不对呢?”,我们甚至还会“很大胆的怀疑”,“是不是操作系统的环境不一样?是不是框架内核不完善?”,最后往往发现“晕死!数组越界了,只有在极少情况会越界”,“晕死!少一个分号却没有报错”,“晕死!i写成j了”,绝大多数都是基础错误,而且我们浪费了99%的时间怀疑真理,而不是冷静的寻找问题。

3.2.有经验,能看到更多潜在需求

比如说输入错误验证,null参数容错,比如有些参数可能用户想去配置,而不是在代码里写死,这些东西没人会明确告诉你,但是你不做,就会出现问题,这就需要经验

4.经验的价值:提高了质量,节省了时间

一个有经验的程序员,他编程速度可能不快,发一个版本需要很长的周期长,但是质量高。要发多少个测试版本,才是最影响项目周期长度的。

经验不是时间,而是需要不断总结,每次遇到的问题,都一定要分析透彻,不要自己都没明白,说服不了自己就不调查了,下次再发生,别人问起来,自己都不相信自己的回答,简直槽糕透了。

经验不是万能的,需要多看书,学习经典,扩大知识面,经验才有价值。

谨以此文,记录成长,加油!