简单的Delphi三层程序开发

 

一年前开发了一个MIDAS的程序,最近修改服务端,可是这个服务无法注册,最后终于找到了解决办法,这个相关文章如下:(算是备份吧)

(一)MIDAS是什么?
Delphi中MIDAS到底是什么呢?和他相关组件是什么呢?  
MIDAS(Multitiered Distributed Application Services)多层分布式应用服务。
   Delphi所提出的Multi-Tier结构是把原来的Two-Tier前台应用程序内的dbExpress,ADO,BDE,SQL Link,DataMoule,拿到另外一台NT服务器(就是所谓的应用程序服务器),而前台程序只剩下一个可执行文件及MIDAS.DLL,而移到NT 服务器上的DataMoule则变成一个COM程序(Remote DataModule).
   注:前台一定要把MIDAS.DLL发布到系统目录下.
   (1)前台程序会通过调用应用程序服务器提供的方法(接口)提出一个请求
   应用程序服务器会响应这个请求,传送一个相应的SQL命令到后台数据库,而后台数据库会把执行SQL命令产生的DataSet返回给应用程序服务器.
   注:Delphi提供了Type Library来帮助应用程序服务器定义COM方法(接口)
   (2)NT服务器上的COM程序是通过中间软件(dbExpress,ADO,BDE,SQL Link)传送SQL到后台数据库.
      当应用程序服务器要把读取到的DataSet传送给前台时,就必须利用DCOM的机制来进行.Delphi提供的TDataSetProvider组件就会把读取到的DataSet压缩并且分割成一段一段的数据包,通过DCOM或TCP/IP传给前台.
      注:Delphi提供了RemoteDataModule向导来帮你产生COM程序的结构.
      由于Delphi的程序具有传送DataSet的特殊机制,所以Delphi也实现了一个接口叫做IProvider(即TDataSetProvider),来帮助应用程序服务器上的COM程序发送DataSet数据.
   (3)前台程序与NT服务器上的COM程序是通过DCOM的机制互相沟通
      前台的应用程序是通过MIDAS.DLL和应用程序服务器相互沟通,前台的MIDAS.DLL会把接收到的应用程序服务器发过来的数据包再还原成DataSet,丢给前台程序中的TClientDataSet组件.
      注:前台程序必须提供相应的TClientData组件来和应用程序服务器上的每个IProvider(即TDataSetProvider)对应.用户 修改前台数据时,修改的只是Cache(缓存)在前台的Dataset,最后要通过TClientData.ApplyUpdate方法来把前台变动的数 据写回到后台数据库中.
     
(二)创建并注册MIDAS应用程序服务
   Delphi中如何创建并注册MIDAS应用程序服务器COM程序?  
   Delphi提供一些向导(如:RemoteDataModule,Automation Object,TypeLibrary)来自动产生COM程序的结构.
   (法1)创建一个普通应用程序服务器
        新建一个普通工程,然后通过New->Other->Multitier->Remote DataModule,来自动新建一个COM服务器结构.
        注: 要注册创建的MIDAS应用服务器,可以运行应用程序或者使用/REGSERVER开关运行程序.
   (法2)创建一个NTService类型的应用程序服务器,这样就无需登陆系统也能启动应用程序服务器,避免断电重启带来的无法访问应用程序服务器的问题.
        新建一个NTService工程,然后通过New->Other->Multitier->Remote Data Module,来自动新建一个COM服务器结构.
        注: 要注册创建的NTService服务器,通过/install开关来运行程序.
    注: MIDAS程序需要客户端注册MIDAS.DLL和STDVCL40.DLL动态库.      
   
(三)MIDAS应用程序COM服务器实例化模型种类
(1)Internal Instance
     创建一个In-Process的COM程序,即DLL服务器.
(2)Single Instance
     如果每个客户程序都运行服务器程序的一个实例,则使用该模型.就是每个连上线的前台程序,在服务器上都会有一个对应的应用程序服务器被运行.因此每个前台 发出来的查询都会有各自独立Process的应用程序来处理,根本无所谓排队的问题.但是它会比较占用系统资源,影响服务器整体的运行效率.
(3)Multiple Instance
     如果客户程序共享服务器程序,则使用该模型.就是一个应用程序服务器可以同时处理好几个前台程序的链接,以技术的层面来解释就是所有前台程序可以共享单一 Process的应用程序服务器.该模式的最大好处是,激活及运行的效率较快,比较不会耗用服务器太多系统资源,而且管理上比较方便.但是它隐藏着一个不 具备多任务处理的问题,如果一个前台用户发出了一个查询请求,而且这个查询要求产生的结果可能多大数MB,这时候,其他在线前台用户发出的查询要求都必须 等待之前的查询要求运行完并得到相应之后,才得以继续运行.这可能会耗用许多时间,而且,如果一旦某个前台程序的查询发生错误,那么其他在后面排队的查询 请求将会跟着死掉.
   注:那么到底采用哪种模式来创建应用程序服务器?答案是:按系统需求而定.简单的说就是,你可以创建两组应用程序服务器,一组是采用Multiple Instance模式,另一组采用Single Instance模式,而你必须把程序的类型分为两种,一种是查询数据量较小或是比较不重要的写入操作,另一种查询数据量较大或是重要数据的写入操作.如 此一来,你的前台程序就可以放置两个TDCOMConection来各自连上两个不同模式的应用程序服务器,进行不同性质的工作.

(四)MIDAS线程模型
(1)Single
     代表所产生的In-Process COM程序是一个单一线程的程序,一次只能接收一个client发出来的request,由于是循环的操作,所以不会有多任务同时进行的问题,你的COM程序不需要编写多任务处理的部分.
(2)Apartment
     代表每一个Remote Data Module所产生的instance一次只能处理一个前台发出的request,可是如果同时创建多个In-Process COM程序,那么每个COM程序都会有一个线程来处理,每个instance所处理的数据是安全的,可是你必须防止一些共享变量的冲突.
(3)Free
     该线程模式可以让Remote Data Module产生的每个instance通过各自的线程处理每个前台发出的request,所以Remote Data Moudle本身必须采用多线程的程序写法,你必须保护每个instance所处理的数据区域不会互相冲突..当使用ADO数据集时,推荐使用Free模 型.
(4)Both
     与Free相同,除了所有对应前台界面的callback是连续的以外.
(5)Neutral
     此种模式允许多个前台程序在同一个时间以不同的线程来调用Remote Data Module,不过COM对象必须确保不会有前台程序调用的冲突,你要确定每个线程在访问全局变量及实例数据时,不会发生任何冲突.这个模式只适用在COM+.

(五)MIDAS前台程序连接到后台应用程序服务器
(1)SocketConnection:
     只要前台计算机安装有TCP/IP的通信协议即可,但是Application Server上必须要有对应的SocketServer程序scktsrvr.exe
(2)DCOMConnection:
     如果前台计算机系统是Win95,则必须安装DCOM form Win95(去Microsoft网站下载),如果系统是Win98,Me,NT等,则已经包含DCOM Library
(3)Corbaconnection:
     必须安装Visic Broker即Delphi专用的Corba ORB文件,这些文件名称分别是:Orbpas.dll,cw3240mt.dllorb_r.dll,请把这些文件复制到前台计算机的的系统目录下.同 样的Application Server上也不需安装.
(4)WebConnection:
     只要前台计算机安装有TCP/IP协议即可,但是Application Server上必须安装一套Web Server,并且必须把httpsrvr.dll文件安装到Web Server虚拟目录下,再把WebConnection的属性URL指向此虚拟路径即可.
   注:不论采取何种Connection组件,都会用到Midas.dll文件,所以打包时一定要把它分发到前台计算机的系统目录下去.
  
(五)MIDAS如何控制前台权限
(1)原理:
     前台程序与应用程序服务器之间是通过DCOM机制的运行来传送数据,DCOM对象的安全机制是以Windows NT的安全模块为构建基础,换句话说,要设置某个用户是否有远程运行DCOM对象的能力,最基本的条件是这个用户一定要被加入Windows NT的用户组内,如此才有资格连上Windows NT Server,并进而依据DCOM的权限来决定是否能够运行指定的应用程序服务器.
(2)工具:
     在系统目录下有一个DCOMCNFG.EXE工具,可以用来设置应用程序服务器的运行权限.
(3)自己通过程序控制(也许更可取,避免了配置人员的配置复杂性)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 深度编程及其项目应用开发》 作 者: 李存斌 汪兵 编著 丛书名: 万水软件项目应用与实例开发丛书 出版社: 中国水利水电出版社 出 版: 2002-9----------简 介 本书是在总结作者多年Delphi开发经验的基础上编著而成。 全书分为基础篇和应用篇。基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建DLL应用程序、两层数据库应用程序、多层数据库应用程序、Socket编程、串口编程;应用篇结合物资管理信息系统项目应用开发技术和经验,详细阐述了一般管理信息系统软件通用模块的开发,其中包括10章,分别为:物资管理信息系统概述及其总体框架设计、物资管理信息系统后台数据库设计、应用服务器的实现、客户端应用程序的设计、动态连接应用服务器的实现、通用权限管理模块的设计、通用查询组件和报表模块的制作、通用基础数据维护模块的设计、物资管理信息系统业务操作模块的设计、综合查询模块的设计。读者在具有一定Delphi知识的基础上,通过本书的学习,可快速提高Delphi的编程能力和实际开发水平。 本书适用于具有初步编程能力的读者,也可作为高校高年级学生毕业设计的指导书。中国水利水电出版社网站(www.waterpub.com.cn)上包括了书中示例和较为完整的物资管理信息系统的源代码文件,为读者的学习提供方便,同时也为相关软件开发人员的实际应用开发提供捷径和参考。 ----------目 录 丛书前言 前言 基础篇:Delphi深度编程技术 第1章 理解Windows消息 1.1 消息概述 1.2 Windows消息工作机理 1.3 Delphi的VCL消息系统处理原理 1.4 发送消息 1.4.1 Perform() 1.4.2 SendMessage()和PostNessage() 1.4.3 消息的发送 1.5 消息处理 1.6 消息过滤 第2章 进程与线程 2.1 进程与线程 2.1.1 进程概述 2.1.2 进程的直接创建 2.1.3 列举系统打开的进程 2.1.4 线程概述 2.2 进程间通讯(IPC) 2.2.1 利用WM_COPYDATA消息实现进程间通讯 2.2.2 利用内存映射文件实现进程间通讯 2.3 TThread对象 2.3.1 线程的创建 2.3.2 线程的挂起和恢复 2.3.3 线程的终止 2.3.4 与VCL同步 2.4 线程同步 2.4.1 临界区(CriticalSection) 2.4.2 互斥(Mutex) 2.4.3 信号量(Semaphore) 2.5 进程的优先级别 2.5.1 进程的优先级类 2.5.2 相对优先级 2.6 后台多线程数据查询实例 第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件创建实例 3.3 组件的高级技术--属性编辑器和组件编辑器 3.3.1 组件的属性编辑器 3.3.2 组件的组件编辑器 3.3.3 带有属性编辑器和组件编辑器的自定义组件实例 3.4 创建对话框组件 第4章 文件操作 4.1 文件的基本操作 4.1.1 文本文件 4.1.2 有类型文件 4.1.3 INI文件 4.1.4 无类型文件 4.1.5 文件的复制 4.2 内存映射文件 4.2.1 内存映射文件的应甩 4.2.2 映射文件的使用 4.3 内存映射文件的应用 第5章 创建DLL应用程序 5.1 DLL概述 5.2 DLL的创建 5.2.1 DLL项目文件 5.2.2 Exports关键字的使用 5.2.3 DLL中的变量 5.2.4 DLL实例:动态DLL中的窗体 5.3 DLL的调用 5.3.1 静态调用 5.3.2 动态调用 5.4 DLL的入口函数和出口函数 5.4.1 进程/线程的初始化和例程的终止 5.4.2 DLL入口/出口示例 5.5 利用DLL创建插件程序 5.5.1 插件程序的设计思想 5.5.2 插件应用程序的创建 5.5.3 创建调用插件程序的主程序 第6章 两层数据库应用程序 6.1 关系型数据库 6.1.1 关系型数据库概述 6.1.2 结构化查询语言(SQL) 6.2 数据库的连接 6.2.1 基于BDE的数据库连接 6.2.2 基于0DBC的数据库连接 6.2.3 基于AD0的数据库连接技术 6.3 TSession元件 6.4 1 DahBase组件 6.4.1 TDataBase组件的使用 6.4.2 用配置文件动态设置BDE 6.5 数据访问组件 6.5.1 TTable组件 6.5.2 TQuery组件 6.5.3 TStoredProc过程 6.6 数据感知组件 6.7 事务 第7章 多层数据库应用程序 7.1 一个简单的多层应用系统 7.1.1 服务器端应用程序的建立 7.1.2 客户端应用程序的建立 7.2 多层应用系统处理数据的原理 7.2.1 多层应用系统的结构 7.2.2 存取数据的运作原理 7.2.3 更新数据的运作原理 7.3 容错处理和负载平衡 7.4 Active Form 第8章 Socket编程 8.1 WinSock基础 8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 客户/服务器模式 8.1.4 面向连接的协议套接字的调用 8.1.5 面向无连接协议的套接字的调用 8.2 利用Winsock API实现Socket编程 8.2.1 常用WinSockAPI函数 8.2.2 利用WinSockAPI实现Socket编程 8.3 利用组件实现Socket编程 8.3.1 TClientSocket组件 8.3.2 TServerSocket组件 8.3.3 远程抓屏示例 8.4 通讯中间件的制作 8.4.1 磁盘队列的实现 8.4.2 客户端和服务器端发送接收磁盘队列数据的套接字的建立 8.4.3 中间件的简单应用 第9章 串口编程 9.1 串口通信的基础知识 9.1.1 同步通信和异步通信 9.1.2 波特率和数据传输率 9.2 串口通信API 9.2.1 DCB数据结构 9.2.2 与串口通信相关的函数 9.3 利用API函数创建串口通信示例 9.3.1 发送数据部分设计(向串口写数据) 9.3.2 数据部分设计(从串口读数据) 9.3.3 程序的具体设计和实现 9.4 利用SPC0MM组件实现串口通信编程 9.4.1 SPCOMM组件的安装 9.4.2 SPCOMM组件的属性、方法和事件 9.4.3 利用SPCOMM通讯组件实现串口通讯的实例 应用篇:物资管理信息系统项目应用开发 第10章 物资管理信息系统概述及其总体框架设计 10.1 系统总体结构设计 10.2 物资管理信息系统需求定义和业务流程图 10.2.1 仓储管理 10.2.2 计划管理 10.2.3 合同管理 10.2.4 物资管理系统的业务流程 第11章 物资管理信息系统后台数据库设计 11.1 关系型数据库概述 11.1.1 关系型数据库 11.1.2 物资管理信息系统数据库的建立 11.2 物资管理信息系统数据结构的设计 11.2.1 权限管理数据结构的设计 11.2.2 仓储管理数据结构的设计 11.2.3 计划管理数据结构的设计 11.2.4 合同管理数据结构的设计 11.2.5 基础设置数据结构的设计 第12章 应用服务器的实现 12.1 创建应用服务器的实例 12.2 状态区编程 12.3 动态数据库的连接 12.4 远程数据模块的建立 第13章 客户端应用程序的设计 13.1 客户端应用程序系统流程和系统功能 13.1.1 系统流程 13.1.2 系统功能 13.2 构建客户端应用程序框架 第14章 动态连接应用服务器的实现 第15章 通用权限管理模块的设计 15.1 系统登录的设计 15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的制作 16.1 通用查询组件的创建 16.2 通用报表模块的制作 第17章 通用基础数据维护模块的设计 17.1 界面设计 17.2 代码实现 17.2.1 以目录树的格式显示部门档案数据 17.2.2 利用目录树导航数据 17.2.3 利用目录树操作数据 17.2.4 按表格的标题排序 17.2.5 打印部门档案 第18章 物资管理信息系统业务操作模块的设计 18.1 数据表的设置 18.2 收料单据主表显示区 18.3 具体的材料明细表显示区 18.4 数据操作区 第19章 综台查询模块的设计 19.1 数据源的设置 19.2 窗体样式设计 19.3 代码实现 19.3.1 查询数据 19.3.2 打印数据 19.3.3 全部浏览----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值