zoukankan      html  css  js  c++  java
  • 采用了InterBase/FireBird的多层RichClient(RIA)构架

    http://atkins.5d6d.com/thread-660-1-1.html

    一个FireBird+ISAPI+ActiveX的构架原型。
    图1、图2 是两个样例Object
    图3 是部署控制台

    本帖包含图片 本帖包含图片:

    uploaded image

    本帖包含图片 本帖包含图片:

    uploaded image

    本帖包含图片 本帖包含图片:

    uploaded image

    这个框架的好处在于,可以用Delphi的知识去编写BS构架的程序,而且,程序的效果完全是那种后台异步传输数据的机制,No Flicker,把AJax力求达到的目标发挥的有过之而无不及。
    但这个模式有两个局限性:
    1、只能用在32bit Windows下的IE中。
    2、首次下载速度较慢,因此更适合Intranet系统的构架

    这个系统是一个应用服务器容器平台,我们做的程序作为容器中的对象运行在其中,包括Applet、Servlet两种对象(这两个词是从Java那里借用过来的,而并非是指Java的内容),也就是指客户端对象和服务器端对象。
    虽然这个系统我说它是一个“Demo”,但是实际上它是一个独立的应用服务器容器实例,只不过开发包还没整理出来。一旦我把开发包发布出来,大家就可以在它上面开发了。
    所以,我建议大家尽量下载,先看一下Demo。掌握了基本要领之后,不懂Web的人也能用Delphi7进行Web开发了。

    安装步骤:
    1、确认系统有IIS,并确认IIS的扩展选项中,ISAPI的执行被打开;
    2、将文件拷贝到某个短路经下,运行Console.exe,点击其中的Install;
    3、服务器最好安装FireBird,但如果仅仅运行Demo,可以不安装;
    4、打开http://服务器名/RichDemo/AppSvr.dll/list,如能打开,说明服务器安装成功。否则,需要进行一定的调试。对于Win2003/IIS6系统,需要将系统管理员的用户名、密码输入进去。对于IIS6之前的版本,则不用输入密码。
    ==========================================
    客户端的配置:需要将服务器加入信任,这些将在页面中有所提示。
    ==========================================
    进入系统:点击Console中的Applet中的项目的“运行”按钮即可。

    测试目地:
    看看系统在安装过程中会有哪些问题、难题;
    服务器安装是否繁琐(和其它服务器类软件相比);
    初次使用的感觉如何,插件安装的速度如何;
    系统运行速度如何;

    为什么要用这个框架FAQ.
    1、Delphi 7已经提供了ActiveForm开发功能,那么你的这个框架还有什么用呢?
    答:的确如此。然而我的框架中作了更多的事情。首先是,如果遵循规范,那么开发Applet Object比开发一个独立的ActiveForm要容易。开发ActiveForm需要开发人员对COM/ActiveX机制有深入的了解,其中包括开发ActiveX过程中遇到的各种棘手问题,试想这样的场景:当你辛苦的开发完一个ActiveForm后,忽然发现你的作品不能使用Ctrl+C,你是什么感觉?恐怕你需要到处查询Delphi/DAX框架资料,解决这类问题。
    2、这个框架客户端第一次打开时,为什么这么慢?
    答:确实如此。然而也就慢这一次了(除非框架版本又更新了)。以后再打开页面,就会非常快。
    3、这个框架能在互联网上运行吗?
    答:当然可以。但是,互联网上运行时,需要你开发的Applet使用互联网的通讯协议(也就是http协议)与服务器交互。并且,由于带宽更窄,所以可能第一次运转需要相当多的时间。这种情况,最好将框架打包安装在客户端。这种模式与Flash非常相像。所以,充分发挥框架的特色,Intranet是最佳的应用场所。
    4、第一个开发包公布的IBX客户端样本,是B/S呢,还是C/S呢?
    答:是B/S形态下的C/S系统,同时具有两种构架的优点。也发挥了FireBird数据库客户端易于部署的特性。
    5、你的框架到底支持不支持多层结构啊?!
    答:当然支持,而且默认开发模式就是Servlet/Applet成对儿开发。但是初期由于我的工作的繁忙,时间的关系和考虑到大家的接受能力,所以先推出ibx Client开发包。
    6、.ao和.xo后缀名的文件代表什么意思?
    答:ao代表“Applet Object”,也就是Applet文件;xo代表Server Extension Object,就是我说的Servlet。

    目前,如果需要开发多层构架,大家可以使用Delphi7开发WebService模块部署到IIS中,在Applet中调用SoapMidas进行连接。

    大家一定要通过“将样例工程另存为新工程”的方式来创建自己的Applet。初级选手切不可直接新建一个dll项目,修改项目后缀名为ao就完事儿了。
    无论是.ao项目,还是.xo项目,项目中的GetModClass函数至关重要,它返回的是模块的主Applet类。
    。。。
    exports
      GetModClass;

    function GetModClass: TModRootClass;
    begin
      Result := TMyAppletObjectClass;
    end;

    我按照你的说明文本中的方法做了,我将uIBModule改为uMyIBModule,并将其中的所有控件与函数都删除,只保留了GetModClass,编译出了一个MyWebIBX.ao文件。
    然后加入到了Console中,运行时提示我“Applet"mywebibx" does not exists!”。
    请问这是怎么回事?
    ===========================================================
    别忘了按“存盘”!!
    本帖包含图片 本帖包含图片:

    uploaded image

    框架使用要领:
    1、推荐使用QuantumnGrid6、FastReport等第三方控件。本框架将不少优秀的第三方控件的二进制代码包含在框架中。在Applet中如果使用这些已包入的控件,Applet编译结果体积增长非常小,这样能更大的发挥框架的价值。特定时候我会发布推荐使用的第三方控件的列表。
    2、Applet的正常的体积应该被控制在300K左右。实际上,一个相当复杂的Applet,可能仅仅200余K,它的体积和加载速度相当于一个稍大的JPG图片。而且,系统支持热部署。用户在使用时,即可更新系统。用户刷新IE,新版本就显示出来。系统能够“容忍”的最大Applet体积可达2,3兆。太大体积的Applet加载起来速度就不尽理想了。
    (待续..)

    最简单的Applet是这样的:
    unit uModTemplate;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, uModRoot, ExtCtrls, StdCtrls, udmCLXBaseAppX;

    type
      TModTemplate = class(TModRoot)
        Button1: TButton;
        Panel1:  TPanel;
        Button2: TButton;
        Button3: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    function GetModClass: TModRootClass;

    implementation

    {$R *.dfm}

    exports
      GetModClass;

    function GetModClass: TModRootClass;
    begin
      Result := TModTemplate;
    end;

    procedure TModTemplate.Button2Click(Sender: TObject);
    begin
      ShowMessage(CurrentContext.Document.title);
      CurrentContext.CurrIE.StatusText := 'Welcome !';
    end;

    procedure TModTemplate.Button3Click(Sender: TObject);
    begin
      CurrentContext.CurrWindow.location.href := 'Demo.Applet';
    //---------------------------------------------//
    //注意这里,这就是实现跳转的代码//
    //---------------------------------------------//
    end;

    end.

    这个Applet没有任何的实质性功能。注意,这个类的父类是TModRoot
    另外,该框架要求Delphi7必须是sp1,ibx版本是7.08。所以,请下载最新ibx for delphi7
    在这里:

    关于模块划分方面,我主张是各个击破的风格。模块的颗粒度适中。每个模块是一个独立的Applet,并且模块之间最好完全没有关联。然后通过一个索引Applet将它们整合起来。这个框架的初衷,就是把复杂的系统简单化。因为开发每个小的Applet都是轻松而愉快的。
    ====================================================
    另外,关于ibx方面,我建议下载安装ibx 7.08 for delphi7,而不是最新的7.11。我上面提供的下载ibx的地址包含了目前最新版本7.11,但是该版本是针对interbase 2007的,功能上并没有太多提高,却与FireBird差距较大。而ibx 7.08则是经过我验证了的版本,与IB、FB都能兼容,非常稳定可靠。

    另外,我建议彻底淘汰ibtable,而使用ibquery+provider+clientdataset,这样,会带来很多好处。

    大家开发Applet时,请注意CurrentContext对象的用法。通过操纵CurrentContext对象,可以达到和IE的互动。

    问题解答:
    再请教一下,我在appllets中怎么才能启动另一个ao文件呢(就像你在hello.ao中启动demo.ao),这是怎么做的呢?
    ===============================================
    答:通过CurrentContext的操作(参阅上文)。

    再有,如果我有n个Form,那么我是要将每个Form做成一个ao,还是合在一个ao中呢?
    ===============================================
    答:分开为好


    如果我新建一个Form是否是应该继承自TIBModRoot,直接继承TForm可不可以(因为我试过继承自TIBModRoot或TForm,然后show都能运行)。
    ===============================================
    答:每个ao里面必须有一个TModRoot的直接或间接后代。你可以创建窗体。不过,一个IE页面打开后,还挂着一个窗体,给人感觉怪怪的。一般都是在这个窗体上放置一个Panel,把所有的界面元素放到Panel中,然后运行时把该Panel内嵌到Applet中(比如说Applet上面的多页面中的一页),该窗体不可见,用这种方式实现模块化。不过,除了主类本身以外,任何窗体需要开发者自行维护其创建、释放。

    我在uIBModRoot文件中看到有你增加了很多比如cxGridTableView的QuantumnGrid6组件单元,并且你在IMainModService这个interface中还有引用,可不可不用它?IMainModService是做什么的?
    ===============================================
    有一定的用途,暂时不用管它。

    我在另一个帖子里不是说了吗?

    在uIBModRoot中缺少uMessageBox.dcu这个文件,编译不过去,请问怎么办
    ===========================================================
    请在项目中的Uses Packge列表中,添加CBRun、CBExt两个dcp。如果Delphi编译中说找不到这两个dcp,那么就把这两个dcp拷贝到Delphi的Lib路径下。

    本帖包含图片 本帖包含图片:

    uploaded image

    多谢,还在学习中

    我按照你上面说的“最简单的Applet”试了一下,为什么显示不出来控件呢(但是页面可以载入)?

    我是这样做的(因为按照你说的将项目等文件另存的方式已经试过去了,所以我按照自己的想法试了一下)
    1.新建一个DLL,将输出类型改为“ao”;
    2.将uModRoot增加到项目中;
    3.新增加一个继承自TModRoot类的窗体(这样是不是就是你说的“最简单的Applet”呢),然后在窗体上随意的增加了几个控件;
    4.编译,然后增加到Console中,运行。

    页面显示出来了,但是显示不出来我在上面增加的控件,请问是怎么回事?难道一定要继承TIBModRoot才行吗?我不想使用数据库是否就可以按照我上面的步骤做呢?

    再有能否讲一下CurrentContext的功能等,谢谢了。

    dll项目必须引用CBRun。如果用了很多第三方控件,最好也引用cbext。
    同时,所有的可视控件必须放到ContentPanel里面。所以最要要用修改模板项目的方法新建Applet,这样,既方便,有不容易出问题。

    在调试N次后,终于编译出AO文件.

    现在的问题是在把AO加入控制台运行时,每次都要出现下图

    本帖包含图片 本帖包含图片:

    uploaded image

    点确定后,后边就一切正常了.

    我估计是删代码时删除了一些有用的代码.(我删除了大量cx控件引用与实现的代码,公司电脑没有装这套控件)

    见意提供一个只保存必要代码的"干净"的uIBModule.pas,这样也不怕删多了.

    CurrentContext对象能够提供很多方便来让开发者与IE互动。比如果,访问当前CurrentContext.Document代表当前的html的对象模型。其可访问的主要属性如下:
      IHTMLDocument2 = interface(IHTMLDocument)
      ....
        property all: IHTMLElementCollection read Get_all;
        property body: IHTMLElement read Get_body;
        property activeElement: IHTMLElement read Get_activeElement;
        property images: IHTMLElementCollection read Get_images;
        property applets: IHTMLElementCollection read Get_applets;
        property links: IHTMLElementCollection read Get_links;
        property forms: IHTMLElementCollection read Get_forms;
        property anchors: IHTMLElementCollection read Get_anchors;
        property title: WideString read Get_title write Set_title;
        property scripts: IHTMLElementCollection read Get_scripts;
        property designMode: WideString read Get_designMode write Set_designMode;
        property selection: IHTMLSelectionObject read Get_selection;
        property readyState: WideString read Get_readyState;
        property frames: IHTMLFramesCollection2 read Get_frames;
        property embeds: IHTMLElementCollection read Get_embeds;
        property plugins: IHTMLElementCollection read Get_plugins;
        property alinkColor: OleVariant read Get_alinkColor write Set_alinkColor;
        property bgColor: OleVariant read Get_bgColor write Set_bgColor;
        property fgColor: OleVariant read Get_fgColor write Set_fgColor;
        property linkColor: OleVariant read Get_linkColor write Set_linkColor;
        property vlinkColor: OleVariant read Get_vlinkColor write Set_vlinkColor;
        property referrer: WideString read Get_referrer;
        property location: IHTMLLocation read Get_location;
        property lastModified: WideString read Get_lastModified;
        property url: WideString read Get_url write Set_url;
        property domain: WideString read Get_domain write Set_domain;
        property cookie: WideString read Get_cookie write Set_cookie;
        property expando: WordBool read Get_expando write Set_expando;
        property charset: WideString read Get_charset write Set_charset;
        property defaultCharset: WideString read Get_defaultCharset write Set_defaultCharset;
        property mimeType: WideString read Get_mimeType;
        property fileSize: WideString read Get_fileSize;
        property fileCreatedDate: WideString read Get_fileCreatedDate;
        property fileModifiedDate: WideString read Get_fileModifiedDate;
        property fileUpdatedDate: WideString read Get_fileUpdatedDate;
        property security: WideString read Get_security;
        property protocol: WideString read Get_protocol;
        property nameProp: WideString read Get_nameProp;
      end;

    CurrentContext的成员如下:
        ServerURL:  string;
        CurrIE:      IWebBrowser2;
        CurrWindow:  IHTMLWindow2;
        Document:    IHTMLDocument2;
        Document3:  IHTMLDocument3;
        QueryFields: TStringList;

    它们都是非常有用的变量。以QueryFields而言,如果你的地址是
    http://yourHost/RichDemo/AppSvr.dll/YourApplet.Applet?v1=123&v2=456
    那么就可以通过CurrentContext.QueryFields.Values['v1']和CurrentContext.QueryFields.Values['v2']来取得参数值,进而在InitModule里面进行针对参数值的初始化了。所有的IE对象的声明可参考Delphi\Source\Internet\MSHTML.pas。如果你能够熟练的用JScript操纵IE的页面对象,那么这些知识绝大部分能够以Delphi的语法运用在Applet中。

    我估计是删代码时删除了一些有用的代码.(我删除了大量cx控件引用与实现的代码,公司电脑没有装这套控件)
    见意提供一个只保存必要代码的"干净"的uIBModule.pas,这样也不怕删多了.
    ====================================================================
    呵呵,其实你做了一件傻事儿。即便是你用一个完全空白的Delphi7,如果你在工程中引入了CBRun和CBExt两个dcp,那么你也能完全编译uIBModule.pas。而你删除了某些代码,对你的Applet的编译体积缩小成度贡献非常小。所以,你完全不用动uIBModule单元。

    最简单的ao。但是很有用。

    本帖包含附件 本帖包含附件:

    Hello.rar  [附件大小:7.0kb, 查看信息...]

    我手头作的工作:基于RichClient的收发件:

    本帖包含图片 本帖包含图片:

    uploaded image

    多谢,看到hello.ao后我终于知道是什么原因了,原来使用一个空applet时,在窗体上的一定要将所有的控件包含在一个容器控件内(比如Panel或GroupBox,不然控件显示不出来。

    这里好了,如果我不使用数据库就用空的applet,如果用数据库就用IBModRoot的子窗体,嘿嘿。

    现在做一些简单的开发应该没什么问题了,谢谢emote 

    麻烦你再回答我几个问题emote 

    我看到你的uMessageBox中的两个函数ShowMessageYang、ShowWarningMessageYang,我用了一下出现“Access violation at address 0794ABF5 in module 'CBExt.bpl'. Read of address 000002F8”这个提示,它们是不是不能使用呢?能不能公开一下uMessageBox中的函数呢?

    第二个问题,也是我最想知道的

    你在上面已经解释了为什么要使用FB,但经我测试,我可以在我的Applet上使用ADO+MSSQL数据系统(当然,我是在我的本机上进行的测试,不知道这是不是有关系),这说明什么呢?是不是说在Applet上可以使用其他的任何数据库系统,而不局限于FB呢?

    多谢,看到hello.ao后我终于知道是什么原因了,原来使用一个空applet时,在窗体上的一定要将所有的控件包含在一个容器控件内(比如Panel或GroupBox,不然控件显示不出来。

    这里好了,如果我不使用数据库就用空的applet,...




    我直接继承madroot,里边就有一个Panel,还是显示不出控件来?????


    type
      TModRoot2 = class(TModRoot)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure ContentPanelClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      ModRoot2: TModRoot2;

    implementation

    {$R *.dfm}

    procedure TModRoot2.Button1Click(Sender: TObject);
    begin
      inherited;
    ShowMessage('测式');
    end;

     tomtom于2007-2-6 16:09:14在大作中提到:

    我直接继承madroot,里边就有一个Panel,还是显示不出控件来?????


    type
      TModRoot2 = class(TModRoot)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        p...



    在我机器上确实是必须将我自己的所有控件都放入到我自己的控件容器中,不然显示不出来的

    再请教一个问题,如果才能将CBRun.bpl打包到别的机器上安装呢?

    我在我的机器上使用信任站点方式过去了,但是在另一台机器上却怎么也不行,就是不让我安装组件,我把信任度与信任站点都设上了也不行(我在那台机器设置的和我本机上设置的是一样的),这怎么办呀,能否有其他的方式将CBRun安装到客户端上呢?

    本来这个框架并不局限于FireBird数据库。然而,由于我本人热衷于FireBird,所以我默认支持这个数据库。你如果用ado连接mssql,要是能保证客户端的mdac版本很新的话,也没问题(但有的时候客户端的mdac坏了,那就不行)。当然,配合odac的Net模式连接Oracle的话,那么本框架也能适合,因为odac的Net模式,Oracle客户端免部署。其实在我的范例中,就有个Oracle SQLBuilder。
    CBRun.bpl可以在部署成功的机器上的系统路径下搜到,弄到别的机器上注册一下即可。但是,加入信任后,是否将信任的站点的安全性设定为“低”了呢?除了Win2003的高安全服务器之外,其他工作站应该都没问题的。


     

    麻烦你再回答我几个问题emote 

    我看到你的uMessageBox中的两个函数ShowMessageYang、ShowWarningMessageYang,我用了一下出现“Access violation at address 0794ABF5 in module 'CBExt.bpl'. Read of address 000...



    这个是个Bug。如果非得用,可以把fMessageBox手工创建一下。
    if not assigned(fMessageBox) then
    fMessageBox := TfMessageBox.Create(nil);

    终于调试成功了.
    原来是我把GetModClass;删了,看了Hello.dpr以后明白多了.

    把多窗口放在一个AO中比较简单一点,但是yangdong你在上边的贴中说分开好一点,我想问一下分成多个AO后,窗口之间通讯会不会有问题?

    类式ASP中的Application与Session功能如何实现?

    怎么说呢,最好别通讯。但如果非要通讯,也能做到,有若干方式。

    类式ASP中的Application与Session功能如何实现?
    ========================================
    因为客户端对象是PE(Portable Executable),所以实现Application和Session类似的功能就完全不成问题了。可以用读写注册表、配置文件来维护客户端持续信息。同时,也可以读写Cookie(两种方法:CurrentContext.document.cookie,或者通过API的cookie相关函数)来实现会话。但这些未必真的用得着。因为RichClient并不需要刷新页面,而往往是内部直接刷新数据,也就不怎么需要持续信息。

    把多窗口放在一个AO中比较简单一点,但是yangdong你在上边的贴中说分开好一点,我想问一下分成多个AO后,窗口之间通讯会不会有问题?
    ================================================================
    最“傻”的通讯方式可能就是通过参数传递的方式了,用带参链接跳转或打开新applet,形如xxx.applet?xxx=xxx&xxx=xxx;
    其次也可以是内存映像文件;也可以通过Cookie。但是总体来说,独立的业务模块之间应该不存在这么紧密的通讯耦合。毕竟,纯ASP系统就是这样的观点,模块之间很难有实质性的通讯。相比之下,RichClient提供的灵活性还大些。

    不错,现在我已经把一些MS SQL的简单运用,移植上去了.

    以后会不会把开发包的功能整理一份CHM?

    还有,以后这个平台的发展规划能不能谈一下?

    请问怎样才能在客户端上正确注册CBRun.bpl呢?
    我在我机器上的“C:\WINDOWS\Downloaded Program Files”下面找到了CLXBaseRun Control这个文件,但没找到CBRun.bpl。可是这个文件不允许复制,我在cmd方式下将它copy到客户端上,不知道这样是否正确。

    然后我在客户机上使用regsvr32将它注册上,注册完毕后虽然浏览applet时不会提示要安装组件了,但是会出现错误,在页面显示不出来。

    请问我上面的步骤是否可行,要怎么才能手动注册CBRun.bpl呢?

    可以直接下载
    http://YourServer/RichDemo/AppSvr.dll/CBRun.bpl
    然后将其拷贝到system32下面,运行Regsvr32 CBRun.bpl即可。

    我计划在春节期间发布完善版(Ver 1.2),将发现的一些问题修正。该平台我原想使用bds2006作为开发平台,可是bds2006始终没有修订某些bug,这使我决心仍用D7作开发平台。我是想做一些文档,然而各方面条件都不允许,包括时间和体力,所以有问题就到论坛上讨论吧。要是真的做文档,恐怕也得百十来页,所以大家先摸索着用。一旦Delphi2007证实很稳定好用,我会考虑把它移植到2007上。
    在完善版中,我会优化一下单元引用列表,把ADO包含到二进制代码中,这样,用ado的applet会缩小编译体积,加载的更快。看看将来有多少用户吧。不过有一点大家放心,就是我会保持这个平台的持续改善和发展,以及免费性。大家可以放心使用。IE淘汰ActiveX的时候还得好多年呢。

    另外,我手头用的这个平台要比给大家的要好用的多,这里面包括Delphi开发环境自动远端部署、QueryBuilder、数据库代码生成工具、现成的第三方控件,而且我这里的默认开发模式是三层构架。但并不是我不愿发布这些东西,而是我无法很快的把这些东西从我的开发环境中整理出来。要不然的话,就得把我的整个开发环境都公开,体积有2G那么大。在我这里,我一点一个按钮,Applet就被编译后自动上传到服务器上了。我相信很多东西会有机会被陆续公布的。

    能不能讲一下那几个页都是做什么的
    1.Applects页是用来载入与启动ao文件
    2.servlets肯定是用来载入xo文件,但xo文件怎么做,此文件又是做什么的呢?
    3.Shared Modules呢?
    4.DLLs/OCXs呢?是不是需要在客户端安装ActiveX控件,需要在这里声明呢?那在客户端那里还需要另行安装吗?
    5.Data Files?
    6.dependent module这个怎么回事呢?

    能不能讲一下那几个页都是做什么的

    1.Applects页是用来载入与启动ao文件
    ========
    对。

    2.servlets肯定是用来载入xo文件,但xo文件怎么做,此文件又是做什么的呢?
    ========
    这部分开发包还得等等,因为需要大家安装RemObjects。

    3.Shared Modules呢?
    ========
    bpl文件。但所有的bpl必须首先引用cbrun。

    4.DLLs/OCXs呢?是不是需要在客户端安装ActiveX控件,需要在这里声明呢?那在客户端那里还需要另行安装吗?
    ========
    对。就是自动部署ocx。如果你的applet用到了某些ocx,可以把ocx也加入,并且设定好dependency。

    5.Data Files?
    ========
    暂时没用

    6.dependent module这个怎么回事呢?
    ========
    代表你的applet需要哪些其他模块。

    内置的FireBird数据库是怎么做到分布式的呢?框加内置的FireBird是移动版的吗?做ActiveXForm的时候就不能用文件数据库,因为这样客户机访问不了远程的数据库,还是说你是用的FireBird的移动版,然后在框架架上做了一个数据库的应用服务器?

    其实确实是有一个应用服务器。应用服务器(Servlets)用的是Embeded FB。然后网络访问协议用的是http。不过后来我发现这种做法并不太好,虽然比较cool。安装一个FB能带来很多灵活性,同时系统也比较稳定。所以我建议还是装一个FB Server更好。

    另外,我的框架稍微扩充一下,就可以实现“自动更新绿色客户端”的模式。方法就是,把浏览器这个ActiveX容器更换成我自己编写的ActiveX容器就可以了,也就是说,把我的客户端组件直接作为控件对象插入到我的可执行文件中即可。但是我现在还没有想这么干。另外,本框架支持不通过更改IE设定,直接运行安装程序,这样就不出现你说的问题了。

    到这里下载最新版本,本版的另一贴子:
    http://liwei.csdn.net/Forum/topic.aspx?topicid=1272
    不过,目前的版本仍有一些issues,例如,应该在IE弹出窗体中显示RichObject的时候,可能会出问题。目前对于弹出窗体来说,必须让原窗体至少加载一次RichObject才可。所以如果必须在弹出IE窗体中使用这东西的话,往往在系统的总入口处,做一个RichObject的欢迎屏幕。但一般最好不用弹出窗体,而用Frame来切换界面。

    这个东西目前还没有考虑Linux。因为我们的开发环境就是Windows下的,如果真的要考虑的话,恐怕就必须用Java了。那么整个通讯协议可能都要从新考虑。这个框架本身的其中一个着眼点就是快速紧缩型的http协议,基于RemObject,而不是比较松散臃肿的Soap协议,所以才能做到现在的响应速度。

    目前的版本在服务器部署上有了很好的改進,Win2003以前的版本直接点Install即可安装完毕,以后的版本输入系统管理员帐号后点install即可。

  • 相关阅读:
    event.relatedTarget、event.fromElement、event.toElement
    before/after伪类常见用法
    $.getJSON 跨域
    ExtJS中store.findExact
    C#生成6位随机验证码
    C#验证手机号
    jQuery轮播图的事项 代码详细,容易理解。。。。谢谢观赏
    ES6 中 static 的this 丢失问题解决办法 简单明了 备注清晰 谢谢欣赏
    ES6 中 static 的this 问题 简单明了 备注清晰 谢谢欣赏
    ES6 中用class创建img 详细明了,步骤清晰,解释完美,谢谢欣赏
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/2453589.html
Copyright © 2011-2022 走看看