进程内COM与进程外COM
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服务器开发工具都带有每种形式的服务器例程,用户可在开发时参考。
进程内COM与进程外COM的更多相关文章
- 【转载】进程内COM与进程外COM
原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html 1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档 ...
- netcore进程内(InProcess)托管和进程外(out-of-Process)托管
当一个 ASP.NET Core 应用程序执行的时候,.NET 运行时会去查找 Main()方法,因为它是这个应用程序的起点. 然后,Main()方法调用静态类WebHost中的静态方法CreateD ...
- [06]ASP.NET Core中的进程内(InProcess)托管
ASP.NET Core 进程内(InProcess)托管 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...
- ASP.NET Core 进程内(InProcess)托管
ASP.NET Core 进程内(InProcess)托管 在 ASP.NET Core 中的进程内(InProcess)托管模型 什么是 Kestrel 服务器 当一个 ASP.NET Core 应 ...
- MXNet源码分析 | KVStore进程内通信
本文主要基于MXNet1.6.0版本进行分析. MXNet的KVStore模块下有几个比较重要的类.KVStore是一个抽象类,提供了一些通用的API,例如Init.Push和Pull等.因为KVSo ...
- ASP.NET Core 进程内与进程外的性能对比
ASP.NET Core 进程内与进程外的性能对比 本文内容是<深入去浅出ASP.NET Core>提供的扩展内容,毕竟在书里说进程内外的性能说明对比,对于初学者而言,稍微复杂了点. 我在 ...
- HOOK函数(一)——进程内HOOK
什么是HOOK呢?其实很简单,HOOK就是对Windows消息进行拦截检查处理的一个函数.在Windows的消息机制中,当用户产生消息时,应用程序通过调用GetMessage函数取出消息,然后把消息放 ...
- Linux进程内消息总线设计
文章目录 Windows平台进程内消息总线 如果没有消息总线,会产生什么问题 死循环包含关系 高耦合.低内聚 消息总线 结构图 原理 生产者与总线的关系 总线与消费者的关系 Linux进程内消息总线设 ...
- Android源码——Activity进程内启动
进程内启动Activity MainActivity组件向ActivityManagerService发送一个启动SubActivityInProcess组件的进程间通信请求: ActivityMan ...
随机推荐
- manacher模板
转自:http://blog.csdn.net/zzkksunboy/article/details/72600679 作用 线性时间解决最长回文子串问题. 思想 Manacher充分利用了回文的性质 ...
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数
Transact-SQL提供了4个排名函数: rand() , dense_rand() , row_number() , ntile() 下面是对这4个函数的解释:rank() 返回结果集的分区内每 ...
- linux c获取本地时间
在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下: #ifndef _TM_DEFINED struct tm { int tm_sec; /* 秒–取值区间 ...
- **PHP SimpleXML 使用详细例子
要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制, 对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一棵DOM 树,通过对DOM 树 ...
- GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系
GTK,GTK+, Qt是图形界面开发库(GUI Toolkit),用户可以使用这些开发库编写GUI应用,其中GTK+是GTK的升级版. KDE,GNOME,Unity是linux下的桌面环境(Des ...
- ref:关于JAVA中一些安全漏洞示例说明及如何规避方法代码示例总结分享
ref:http://www.xwood.net/_site_domain_/_root/5870/5874/t_c268166.html 标签:安全,漏洞,健壮,java,SQL注入,SS及CSRF ...
- ACM训练计划建议(转)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- Python之路【第十一篇】: 进程与线程理论篇
阅读目录 一 背景知识二 进程2.1 什么是进程2.2 进程与程序的区别2.3 并发与并行2.4 同步与异步2.5 进程的创建2.6 进程的终止2.7 进程的层次结构2.8 进程的状态2.9 进程并发 ...
- 联系表单 1_copy
你的名字 (必填) [text* your-name] 你的邮箱 (必填) [email* your-email] 主题 [text your-subject] 你的留言 [textarea your ...
- 在Eclipse中修改web项目的名称
在Eclipse中修改web项目的名称 一.误区: 单击要修改名称的项目上右键Refactor->Rename,然后修改成另外一个名称 (光这样是不够的,哪怕你再修改web.xml中的displ ...