访问进程外组件****.exe,要有代理和残根DLL,用IDL编写这组件时就编写接口,那代理DLL怎么跟残根DLL通信,残根DLL又是怎么调用组件内函数的,代理DLL怎么跟残根DLL通信,LPC和RPC的机制到底是怎么样的

解决方案 »

  1.   

    1.不是任何进程外组件XX.exe都需要代理存根DLL的.比如你只需要访问进程外组件的IUnknown/IDispatch等等接口,就不需要代理存根DLL,系统已经有缺省的代理存根为你服务
    2.代理存个DLL创建见我得博客
    3.代理存根之间通信见http://www.th7.cn/Article/bc/VC/200702/10505.html
    4.关于LPC/RPC
    LPC: LOCAL PROCEDURE CALL
    在 Windows NT 中,客户-子进程通讯的方式与 MACH 操作系统中的类似。每种子系统都有一个可户端 DLL 用来与客户可执行程序链接。 DLL 中有子系统 API 的 stub 函数。只要客户进程——使用子系统接口的应用程序——发出 API 调用,DLL 中相应的 stub 函数就将调用传递给子系统进程。在处理完成后,子系统进程将结果返回给客户 DLL。DLL 中的 stub 函数等待子系统返回结果,再转回来将结果传递给调用者。客户进程只会觉得像是在调用自己代码中的函数一样。在 RPC 下,客户机确实是通过网络来调用某远程主机,因此叫做远程过程调用。Windows NT 的服务器与客户机运行在同一台机器上,因此此机制叫本地过程调用。LPC 共有三种类型。第一类最多只能发送394字节的小消息。第二类能发送大一些的消息。第三类 LPC 叫做 Quick LPC,使用在 Windows NT 3.51 的 Win32 子系统上。前两类 LPC 使用端口对象进行通讯。端口类似于 Unix 上的套接字或命名管道,是进程间的双向通讯通道。然而,与套接字不同的是,通过端口传递的数据并不是用流的形式。端口明确了消息的边界。简单讲,可以使用端口发送和接收消息。子系统用众所周知的名字来创建端口。需要调用子系统服务的客户进程使用这个名字打开相应的端口。打开端口后,客户程序就可以通过端口与服务器程序通讯了。
    (以上内容转载自 <Undocumented Windows NT>)RPC跟LPC类似,但是支持基于网络的分布式处理,Remote Procedure Call。实际的用法可以看看MSDN,google了一下找到个blog有说这个的:http://www.cppblog.com/jb8164 /archive/2008/04/28/48368.html
      

  2.   

    LPC(本地过程调用) 和 RPC(远程过程调用)其实RPC是广义的,RPC可以发生在不同的主机之间,也可以发生在同一台主机上,发生在同一台主机上就是LPC。RPC可以采用TCP/IP、SPX、NetBIOS、命名管道、以及“本地”作为底层的通信手段,这“本地”就是LPC。另一方面,Windows是一个带有许多微内核系统特征的操作系统(尽管它的内核不是微内核),系统中有不少“系统级”的服务进程,例如大家已经熟知的csrss、管理用户登录的“本地安全认证服务”进程LSASS等等,用户进程以及微软提供的系统工具软件经常需要调用由这些服务进程提供的服务,这里LPC就起着重要的作用。
        LPC的基础是一种称为“端口(Port)”的进程间通信机制,类似于本地的(Unix域的)Socket。这种Port机制提供了面向报文传递(message passing)的进程间通信,而LPC则是建立在这个基础上的高层机制,目的是提供跨进程的过程调用。注意这里所谓“跨进程的过程调用”不同于以前所说的“跨进程操作”。前者是双方有约定、遵循一定规程的、有控制的服务提供,被调用者在向外提供一些什么服务、即提供哪些函数调用方面是自主的,而后者则可以是在不知不觉之间的被利用、被操纵。前者是良性的,而后者可以是恶性的。
      

  3.   

    2楼的创建DLL代码要下载啊,没积分下载了。
    那组件.exe要怎么实现,能不能够做个非常简单的exe组件和代理,存根DLL看下,贴出代码,不要用ATL的(还没学到ATL) 谢谢