组件与过程调用

 
每一个EXE中都有其自己的进程空间,因而不用的EXE中的组件和客户将在不同的进程中运行。DLL则与EXE不同,它将被映射到链接它们的EXE文件的进程空间中。因而,DLL也被称作进程中服务器,EXE则被称作是进程外服务器。在某些情况下,EXE也被称作是本地服务器,以同另外一种类型的运行于另外一个不同机器上的进程外服务器“远程服务器”相区别。
组件将把一个接口传给客户。一个接口实际上是一个函数指针的数组,为调用接口中的函数,客户必须能够访问同接口相关联的内存。若组件是一个DLL,这一点是很容易实现的,因为组件和客户处于相同的地址空间中。但如果组件和客户在不同的地址空间中,客户将无法访问组件进程的地址空间。
在某些情况下,我们需要调用EXE而不是DLL来实现组件,原因之一是应用程序可能已经是一个EXE文件了。对于跨越进程边界的接口,我们需要考虑如下一些条件:
(1)       一个进程需要能够调用另外一个进程中的函数;
(2)       一个进程需要能够将数据传递给另外一个进程;
(3)       客户无需关心它所访问的服务器是进程内还是进程外服务器。
本地过程调用
对于进程间的通信,有几种不同的方法如:动态数据交换(DDE)、命名管道以及共享内存等。COM所用的方法则是本地过程调用(LPC),LPC是同一机器上不同进程间通信的一种方法,是基于远程过程调用(RPC)的用于单机上进程间通信的专利技术。这种技术使得不同机器上的进程可以使用各种网络传输技术进行通信。LPC是由操作系统实现的,由于操作系统知道每一个进程逻辑地址空间相对应的物理地址,因此操作系统可以调用任意进程中的任意函数。

 

 

调整
调用EXE中的函数知识第一步。我们还需要一种方法将函数调用的参数从一个进程的地址空间传到另外一个进程的地址空间。这种方法称作“调整”。
若两个进程都在用一台及其上,则调用过程是比较直接的:只需要将参数数据从一个进程的地址空间复制到另外一个进程的地址空间就可以了。若参与参数传递的两个进程在不同的地址空间中,那么考虑到不同机器在数据表示方面的不同,如整数的字节顺序可能会不一样,必须将参数数据转换成标准的格式。
LPC技术可以将数据从一个进程复制到另外一个进程中。但为完成这一点,仅需要一个C++头文件是不够的,还需要其他的一些信息以将参数打包并传送给其他进程。
为对组件进行调整,可以实现一个名为IMarshal的接口。在COM创建组件的过程中,它将查询组件的IMarshal接口,然后调用此接口的成员函数已在调用函数的前后调整或反调整有关的参数。COM库中实现了一个可以供大多数接口使用的IMarshal的标准版本。如果需要优化进程性能,可以对IMarshal进行定制。
代理/ 残根DLL
在COM中,客户将同一个称为代理的模仿组件的DLL进行通信,以为客户完成参数的调整及LPC调用。一个代理就是同另外一个组件行为相同的组件。代理必须是DLL形式的,因为它们需要访问客户进程的地址空间以便对传给接口函数的数据进行调整。此外,组件还需要一个被称作是残根的DLL,以对从客户传来的数据进行反调整。残根已将对传回给客户的数据进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值