ET框架概述-培训大纲
要素申明
培训对象(以工龄,工种,或从事领域分类)
A.工龄和领域:
a.从事ET开发工作1年以内的同事
b.或其他对ET感兴趣的同事
B.工种:
a.原始目标:程序开发人员
b.ui培训学校其他:总监可以根据实际情况考虑其他工种的同事参训
培训课时:2小时
培训目的:(期望产生的成果)
C.让参加培训的同事对ET的整体框架有初步的了解
D.增长框架设计的知识
E.有助于在今后工作中定位BUG
F.有助于开发新功能时能尽可能考虑得全面些,不会盲目地破坏框架
培训形式 :宣讲
自我介绍
姓名:
工作经历:
培训内容
ET的整体架构
给出ET的框架图,并进行简要说明
上图是ET的基本框架结构。
G.注1:并没有按照上图严格限定各个模块之间的调用关系
H.注2:有一些模块并没有绘入到上图中
启动顺序:
I.Shell -> AppLogic -> UILogic, Render, ETCore,...
响应用户界面消息和命令
J.Shell -> UILgoic ->
对外提供API,用于二次开发:
K.对外提供的API:是指基于Windows COM机制实现的跨进程调用接口。这是windows操作系统实现的基于接口技术(顺便问问有多少人了解IUnknown,IDispatch),并实现了通用的存根代理机制的操作系统一级的服务。只要遵循windows提供的实现规范,任何应用程序都可以让其他应用程序可以通过接口对象来操作自己。
L.二次开发:嵌入IE,被其他应用程序调用
M.Shell实现的API:对界面进行定制的API
N.AppLogic实现的API:其他所有API
Shell的概要说明
Shell是我们的可执行程序:
O.Shell就是WPS.EXE, ET.EXE, WPP.EXE。简单来说,他们像一般可执行程序那样工作。
P.Shell最主要的内容是:菜单,工具条,对话框,主窗口和文档窗口。他们接受windows消息,并派发到内核,有内核处理。有时候派发之前需要在Shell这一层做一些逻辑判断或效果预览(比如设置字体等)。有时候需要将内核返回的结果做一些封装,用合适的方式和用户互动(比如查替换对话框等)。
Shell和内核的对应(以ET为例):
Q.启动时,shell会通过windows api 加载 applogic这个dll,并从这个dll的导出函数中获取内核的Application对象。Shell自己有一个application对象,仅代表shell程序。
R.Shell创建文档窗口时,从内核的Application对象中获得Document对象,获得Window对
象。将这些对象和Shell内的对象关联起来,从而能够将消息发送到正确的内核对象实例上去。
S.其他类似,不描述。
多语言支持
T.需要为多语言支持做一些特殊的工作,才能让应用程序在不同语言的操作系统下不出现乱码。
U.简述:
a.我们在界面看到的字符串是从et.lng加载上来的。
b.中文、日文、繁体等各有一个et.lng,他们分别放置在office6目录下的2052,1041等目录下。
c.Et.lng大概可以看作是一个大表,每一条记录的内容是:(字符串id,字符串值)
d.Et.exe里面需要使用字符串的地方实际上都是使用了字符串id,运行时根据id从et.lng中获取字符串值并显示出来。
V.内核的多语言也采取了同样的原理,但是实现的手段和使用的字符串管理工具都大不相同。
Shell使用Delphi的理由:
W.认为相对于使用VC,编写界面程序比较容易,做出漂亮的效果比较容易。实际上,当存在较多的Delphi程序员时,这是正确的。缺点在于,界面程序员和内核程序员的技术不通用,当Delphi程序员较少时(比如当前2009年和2010年),做界面和界面效果就是一件很困难的事情了。
X.认为内核和界面使用不同的语言,有助于降低界面程序和内核的耦合度。实际上在降低耦合度方面起到的作用有限。原打算Shell仅仅调用Apploigc提供的API即可,但实际上不能满足需求。在UILogic中,内核向Shell传递了很多自定义接口。缺点在于:增加了开发难度(同步api接口文件描述和资源文件管理出了很多事情),增加了调试难度,增加了人员沟
通成本(原本一个程序员可以做的事情,必须分为两个程序员来做),增加了配置管理成本(需要购买多种开发工具,每日构建也会复杂一些)。
Y.总的来说,我个人认为当初使用Delphi开发界面程序是一个不完全成功的尝试。到目前为止仍然有新的影响出现:比如移植wps到linux下。界面程序的代码必须运行在wine下面,或重写,而其他模块(除了一个模块)都可以移植成原生代码。运行在wine下,对如何实现linux下的二次开发是一个重大考验,目前刘斌正在研究。
ZZ.但是我们必须接受这个现实。因为重做一遍界面程序,也许需要在座所有人花上几年时间。
AA.最后需要感谢我们的第一辈shell程序员,他们当初都是应届毕业生,而现在都是大名鼎鼎的人物了:晁云曈,盘善君,曾有贵,卓洪涛。据我所知,他们成功地实现了当今复杂度最高的delphi桌面程序。还有现在仍然在shell中艰苦奋斗的同事们。
ETUILogic的概要说明
接收Shell转送的用户命令和操作系统消息,并处理
BB.自己实现一些代码
CC.调用Applogic, AppCore, ETCore等模块的方法
最主要的东西:
DD.KActionTarget
a.接收所有菜单命令
b.除了响应命令的函数,还有很多工具类,用来标记当前动作进行时,内核所处的状态。这是细节,也是难点。
EE.KViewActionTarget
a.应shell设计,原意是要接收文档窗口菜单命令。但实际上直接转调了KActionTarget的所有方法。因此只是一个空壳。
FF.KMainWndEventSink
a.接收主窗口消息:比如鼠标键盘消息,应用程序关闭,移动,改变大小,等
GG.KWindowEventSink
a.接收文档窗口消息:比如鼠标键盘消息,子窗口关闭,移动,改变大小,等
HH.KPaneEventSink
a.接收文档窗口内的pane相关的消息:比如鼠标键盘消息,窗口的上下左右滚动消息,焦点获得、丢失消息。
Applogic的概要说明
Applogic的设计目的:
II.对外提供的API从这里暴露出去,供二次开发使用,供shell等其他模块使用。
a.“从这里暴露出去”:涉及到COM实现原理。简单来说,就是windows需要从注册表中到应该从哪一个模块中创建出一个Application对象。我们的设计是:在注册表里面告诉windows,请从applogic这个dll里面创建出Application对象。创建时,由applogic负责启动et.exe(这个过程和双击et.exe启动应用程序正好是相反的)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。