原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html

1、进程内和进程外Com

COM/DCOM 组件可以在DLL 或EXE 文档中实现。

其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们的客户端应用程序执行程序内存之中。因此当应用程序调用COM/DCOM 组件的服务时,就和一般的程序或函数调用一样,非常快速。

在EXE 中实现的COM/DCOM组件是执行在它自己的执行程序之中,因此这种 COM/DCOM组件称为Out-Process Server。当
客户端应用程序调用在独立的执行程序中的 COM/DCOM 组件时必须穿越不同的执行程序,因为 Out-Process Server 在执行时会比In-Process Server 慢许多。

应用程序调用 DCOM 组件时,可能会穿越执行程序,也可能会穿越不同的机器,因此在许多情形下应用程序无法直接调用DCOM 组件,而必须通过Proxy和Stub的帮助应用程序必须通过Proxy/Stub才能调用DCOM组件的服务。

到底什么是Proxy 和Stub 呢?简单地说,Proxy 就是远程COM 对象在应用程序的执行程序中的影像 (Image ),远程COM 对象提供了什么接口和方法,它的Proxy就有什么接口和方法。因此,当应用程序在调用远程对象的服务时,事实上是调用了它的执行程序中的Proxy。当Proxy 被应用程序调用后,Proxy 便会封装这些调用信息,再通过通信协议调用远程的 Stub。而Stub的工作便是接受Proxy的调用信息,再使用这些信息调用真正的COM/DCOM对象。最后,Stub再把调用的结果回传给Proxy,由Proxy回传给应用程序。

Proxy/Stub 是从哪里来的呢?
得根据应用程序使用的接口是原生COM 接口还是Automation 接口来决定。如果是调用COM 原生接口,那么Proxy/Stub便是由Microsoft 的MIDL 编译器根据COM/DCOM 对象的IDL 文档编译而来。而如果是Automation 接口,那么由于 Windows 操作系统提供了通用的Proxy/Stub,因此应用程序可以直接通过这个通用的Proxy/Stub 即可。在Delphi 中,当我们建立 MTS/COM+对象时, Delphi 会使用系统的通用Proxy/Stub DLL,因此我们并不需要为如何产生Proxy/Stub 这两个DLL 烦恼。

2、OPC服务器

在开始开发一个OPC服务器之前,用户还要确定服务器的运行形式。OPC服务器做为一个COM组件,运行方式主要包括进程内(DLL)、进程外(EXE)以及服务(Service)。这里的进程内/外是相对于客户程序说的,当OPC服务器是进程内组件时,它运行在客户程序的进程里(远程连接时是宿主程序(host)的进程),而我们通常接触到的OPC服务器一般都是进程外组件。选择哪一种形式要看具体的应用需求,进程内形式适合轻量级的小型服务器,特别是当底层设备具有较高的性能,支持并发多连接访问,OPC客户及服务器程序处于同一计算机上时,可采用进程内形式。其它情况下进程外形式可能更适合一些。简言之,当你不清楚到底那种更合适时,就选择进程外方式。服务形式主要是和进程外形式比较的,它在后台运行,没有用户界面。当OPC服务器计算机可能在没有用户登录,或者需要经常切换登录用户时,服务形式的OPC服务器是最合适的。无论那种形式,都与设备驱动开发的关系不大,大部分的OPC服务器开发工具都带有每种形式的服务器例程,用户可在开发时参考。

最新文章

  1. java多态的理解
  2. java开发人员,最应该学习和熟练使用的工具类。google guava.(谷歌 瓜娃)
  3. jQuery Validate验证框架详解
  4. GnuStep使用
  5. android 官方文档 JNI TIPS
  6. Sql Server Alter语句
  7. JQUERY 选择器 总结,比较全
  8. 使用 HT 单片机芯片做触摸按键的试验:触摸按键实践一
  9. 产生冠军(set,map,拓扑结构三种方法)
  10. MySQL 分区表各个分区的行数
  11. rsync命令详解、rsync用ssh隧道方式同步
  12. LeetCode-两数之和
  13. 关于使用freemarker导出文档的使用
  14. 关于IWMS中遇到的问题及解决方法
  15. 问题9:tabtle 整理
  16. day10 局部变量 全局变量 作用域前奏
  17. Unity3d 插值Lerp与Slerp
  18. hadoop集群的搭建(分布式安装)
  19. Scala中List(Map1,Map2,Map3 ....) 转成一个Map
  20. 【线段树(单点修改,区间求和)】HDU1166 - 敌军布阵

热门文章

  1. 转: 根据屏幕分辨率,浏览器调用不同css
  2. sql建JOB语句
  3. 关于cocos2dx的textfield事件响应
  4. Ubuntu 14.04 修改时区
  5. Numpy 的常用操作
  6. APUE4.4设置用户ID和设置组ID && 4.5文件访问权限
  7. Data Compression
  8. 【译文】InnoDB 的不同的SQL如何加锁
  9. angular 生命周期钩子 ngOnInit() 和 ngAfterViewInit() 的区别
  10. 多启动引导工具——AIO Boot