远程调用技术代码追踪(socket).docx

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最近阅读了 SocketConn 的源码和 WebService 的源码,把追踪的过程写了下来,方便大家学习。毕竟这需要精力,时间和毅力。感谢煮茶待英雄博志区和三层数据库讨论区兄弟们 的支持,特别是 julian 兄弟,不是他,我可能没耐心继续下去。如果有时间,大家可以继续完善。从 socket 和 Websevice 的底层实现细节,我们发现 BORLAND 的工程师们的构思和实现的过程。我觉得这对我们的学习应该是非常重要的。学会思考。学会读源码,学会分析。 希望和我交往的朋友可通过 QQ 或 Email 联系我。 Wu_yanan2003@ 另见:《远程调用技术代码追踪(webservice) 》 关注我的:《远程调用技术代码追踪(第三方控件) 》 远程调用技术内幕聊聊远程调用的相应技术。 微软的模型是 rpc, DCOM 的封包就是 OleVariant 型的。经常听到有人说 OleVariant 的效率不高,其实 MIDAS 就是采用这种封包的。 有人问方法的调用,秘密都在IAppServer 这个接口里。 客户端要想调用服务器端的方法是需要代理 DLL,和存根 DLL 的。具体的可以参考 COM 原理。进程内的就不说了,因为同一个地址空间,它可以通过指针去访问的。主要说说进程外的实现,这也是我们比较感兴趣的。为什么需要代理 DLL 和存根 DLL,这是由于,不同物理空间的两台机器。对它们来讲,地址是没有用的。 从 A 机到 B 机通过 COM 传一个字符串,整型,都比较容易。那么对象怎么办呢。 大家知道,传递对象,其实就是传递指针而已。即然地址对两台机器而言,已经失去了意义。那么需要有一种机制把 A 机的数据包,发到 B 机,B 机能解释,返回一模一样的内存空间出来。 比如: A 要调 B 机器类的一个方法,怎么做?A 机器要模访 B 机器的内存空间。 A 就傻 BB 的把参数压进去。就调用了,对A 机而言。是完全透明的。 在 DELPHI 中,秘密就在 tlb 中, import type library 这一项 , 例:TRDMCardServer = class(TOleServer) 通过这种方式,不仅可以访问 DELPHI 写的中间层,而且可以访问其实的中间层。 在 SAP 应用中,以前同事,就用这种办法引出代理DLL,来访问 SAP 里面的业务逻辑对象。这个TOleServer 对象是干嘛的?这是大家比较关心的问题。其实 A 机和 B 机双方使用了 COM 工厂进行沟通的。 class function CoRDMCardServer.CreateRemote(const MachineName: string): IRDMCardServer; begin Result := CreateRemoteComObject(MachineName, CLASS_RDMCardServer) as IRDMCardServer; end; ( 注册表中) COM 组件的 localserver32 下面正 是 COM 组件的位置。 研究一下 CreateRemoteComObject 这个函数。 CoCreateInstanceEx 看到这里,有人可能已经理解了。这个函数是用 COM 库中的远程调用的 API。 if Ole32 0 then begin @CoCreateInstanceEx := Windows.GetProcAddress(Ole32, CoCreateInstanceEx); @CoInitializeEx := Windows.GetProcAddress(Ole32, CoInitializeEx); @CoAddRefServerProcess := Windows.GetProcAddress(Ole32, CoAddRefServerProcess); @CoReleaseServerProcess := Windows.GetProcAddress(Ole32, CoReleaseServerProcess); @CoResumeClassObjects := Windows.GetProcAddress(Ole32, CoResumeClassObjects); @CoSuspendClassObjects := Windows.GetProcAddress(Ole32, CoSuspendClassObjects); end; WINDOW 中 ole32.dll 中引出的 API。 现在已经明白是怎么激活了,这种方式是用 DCOM 连接的。 现在来看看 borland socket server 怎么来接收数据,并创建远程数据模块的。先看 scktsvr.dpr

文档评论(0)

hao187 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档