【转载】进程内COM与进程外COM
原文: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服务器开发工具都带有每种形式的服务器例程,用户可在开发时参考。
【转载】进程内COM与进程外COM的更多相关文章
- 进程内COM与进程外COM
1.进程内和进程外Com COM/DCOM 组件可以在DLL 或EXE 文档中实现. 其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们 ...
- 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进程内消息总线设 ...
- Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
随机推荐
- gitbook 入门
安装 gitbook 插件 npm install gitbook-cli -g 或者 yarn global add gitbook-cli 初使化目录 gitbook init 会发现目录下面多了 ...
- 一次存储链路抖动因I/O timeout不同在AIX和HPUX上的不同表现(转)
去年一个故障案例经过时间的沉淀问题没在发生今天有时间简单的总结一下,当时正时午睡时分,突然告警4库8个实例同时不可用,这么大面积的故障多数是有共性的关连,当时查看数据库DB ALERT日志都是I/O错 ...
- 浅谈jodaTime 的使用
第一步:引入依赖: 1 <dependency> 2 <groupId>joda-time</groupId> 3 <artifactId>joda-t ...
- libcurl-7.54.1附加zlib1.2.11的编译
手上有个小程序需要通过HTTP协议通信,选择了出名的libcurl作为支持库.由于网上的教程多是命令行编译,本人记性不好,比较讨厌记住一堆命令,因此折腾了一天通过VS对libcurl和zlib进行了编 ...
- LA5713 秦始皇修路 (mst)
题意: 秦朝有n个城市,需要修路让每个城市都互相连通,现在可以免费修一条路,秦始皇希望他除了这条免费修的路外所需修的路的总和B最短,同时这条免费的路连接的人口之和A尽可能大,求最大的A/B是多少,城市 ...
- Operating System-Thread(3)用户空间和内核空间实现线程
http://www.cnblogs.com/Brake/archive/2015/12/02/Operating_System_Thread_Part3.html 本文主要内容: 操作系统用户空间和 ...
- 起床困难综合症 NOI_2014_D1T1
这道题的正解其实没什么好说的,反而是部分分设计非常巧妙. 之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件. ppt -> pdf -& ...
- 【CF449D】Jzzhu and Numbers
题目 提供一个非容斥做法--\(FWT\) 我们发现我们要求的东西就是一个背包,只不过是在\(and\)意义下的 自然有 \[dp_{i,j}=\sum_{k\&a_i=j}dp_{i-1,k ...
- 使用 BEGINCONTENT() 和 ENDCONTENT() 设定 YII 的 LAYOUTS
Yii 的 views/layouts 是用来放置 layouts 的目录,在默认的情况下会有 main.php 和 column1.php 和 column2.php. main.php 内容定义了 ...
- Odoo作为后端时如何返回数据给webapp、移动端app
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307315.html 使用jinja2渲染的页面,可以直接在调用template.render()时传递参数 ...