Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14506410
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:32:05

下载本文示例代码
   Distributed COM --跨网络工作  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。   大多数的COM编程者仅使用本地的“进程内”服务器,作为DLL运行。DLL载入到客户程序的处理空间,因此很可靠和有效。我们打算使用一个基于EXE的服务器。这意味着服务器和客户端作为分开的程序运行。这个想法很有意义,特别是考虑到两个程序运行在不同的计算机上。当然,它带来了新的难点。  好消息是将COM转换为DCOM是简单的。坏消息是连接客户和服务器时可出现很多的错误。在这里,重点是帮助你避免这些问题。  COM和DCOM的区别  COM和DCOM应用之间的大部分区别都被开发者隐藏起来。客户和服务器端的程序可以一样地编写,而不管程序在哪里运行。这个概念被称为本地/远程透明。  当然,分布和本地COM的内部工作是有着一些区别的。本地的通信可通过许多的方式来完成,包括简单的Windows信息,而连接到一个远程的计算机需要一个全新的对象层和网络传输。除了这些大的区别外,你的程序需要做的改动并不大。  与所有的COM通信一样,只有在客户请求一个服务器的接口时才会开始。在DCOM中,客户端调用CoCreateInstanceEx(),传送服务器计算机的一个描述和请求一个类标识器(CLSID)和接口。该请求由服务控制管理器处理(Service Control Manager,SCM),它是Windows的一部分。SCM负责在服务器计算机上创建和激活COM对象。在DCOM中,SCM将尝试启动远程计算机上的服务器。*************图一*******************  一旦创建了远程的COM服务器,所有的调用将通过proxy和stub对象配置。proxy和stub使用RPC(Remote Procedure Calls,远程过程调用)进行通信,RPC处理所有网络交互。在服务器端,stub对象负责配置,而客户端则由proxy负责。  跨网络的数据传送由RPC负责。实际上,DCOM使用一个扩展类型的RPC,称为对象RPC(Object RPC)或者ORPC。RPC可以运行在多种不同的协议上,包括有TCP/IP,UDP,NetBEUI,NETBIOS和命名管道。标准的RPC协议是UDP(用户数据报协议)。UDP是一个无连接的协议,看来与DCOM这种面向连接的系统配合并不是一个好主意。不过这并不是一个问题,DCOM自动负责管理连接。  你也知道,分布式的COM是通过不同硬件、操作系统和软件组件这样一个复杂的交互完成的。你应该认识到:   a)COM在后面做了很多工作;   b)有许多地方可能出错  在编写时,如果使用Windows95/98系统,仅可使用TCP/IP协议进行DCOM数据传输。这是一个有点讨厌的限制,即使有其它的网络协议,你仍然需要在所有的Windows系统上安装TCP/IP协议。  服务器的改动不大  作为一个程序(EXE)运行的服务器将能够在网络上工作。实际上,将一个服务器转为DCOM方式工作,要做的改动并不大。不过,你要为该服务器加入一些安全性,这需要作一些努力。为了简单,在这里我忽略了安全性。  如果你以前使用的是进程内的服务器,你将需要作一些改变。进程内的服务器是一个DLL,它不可以跨网络载入。一个DLL载入到客户程序的地址空间中,它不可以通过远程连接工作。有一个称为surrogate的工作区,可以将DLL封装为一个可执行的程序,不过,更好的是将服务器转变为一个EXE,要将一个DLL转换为一个EXE,最简单的方法是重新使用ATL向导创建服务器,并且将代码由DLL传送到EXE中。  在我们的例子中,我提供了RemoteServer.exe的源代码,它实现了一个基于EXE的简单DCOM服务器。如果你查看其中的代码,你将发现它是由向导产生的。不过,我在其中加入了两个方法--一个是得到服务器的名字,另一个是得到服务器的系统时间。(若需要源代码,请与我联系)  在编译以上的例子后,我们需要将客户的EXE拷贝到客户计算机。要注意的是,由于它是一个用户自己的接口,因此你还需要一个proxy/stub DLL,并且在客户端和服务端计算机中注册该proxy/stub DLL。如果你使用一个带类库的自动服务器,你还需要将类库拷贝到客户计算机,并且登记它。  你还可以使用OLEVIEW和DCOMCNFG来设置一个远程服务器  实际上,你只需改变寄存器的设置就可以令一个服务器程序远程地运行。有两款微软的工具可做到这一点:OLEVIEW和DCOMCNFG。两款工具都可设置寄存器以让DCOM尝试找到远程计算机上的服务器。你可以在OLEVIEW的Activation标签下输入远程的计算机名字,这样它将在该计算机上被启动。  虽然它可以在旧的非DCOM应用上可行,不过这是一个不太便利的解决方法。我打算还是集中在使用编程的方法来设置远程激活,只要你掌握了它,这种方法将是更灵活的。共5页。 1 2 3 4 5 :    Distributed COM --跨网络工作  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。   大多数的COM编程者仅使用本地的“进程内”服务器,作为DLL运行。DLL载入到客户程序的处理空间,因此很可靠和有效。我们打算使用一个基于EXE的服务器。这意味着服务器和客户端作为分开的程序运行。这个想法很有意义,特别是考虑到两个程序运行在不同的计算机上。当然,它带来了新的难点。  好消息是将COM转换为DCOM是简单的。坏消息是连接客户和服务器时可出现很多的错误。在这里,重点是帮助你避免这些问题。  COM和DCOM的区别  COM和DCOM应用之间的大部分区别都被开发者隐藏起来。客户和服务器端的程序可以一样地编写,而不管程序在哪里运行。这个概念被称为本地/远程透明。  当然,分布和本地COM的内部工作是有着一些区别的。本地的通信可通过许多的方式来完成,包括简单的Windows信息,而连接到一个远程的计算机需要一个全新的对象层和网络传输。除了这些大的区别外,你的程序需要做的改动并不大。  与所有的COM通信一样,只有在客户请求一个服务器的接口时才会开始。在DCOM中,客户端调用CoCreateInstanceEx(),传送服务器计算机的一个描述和请求一个类标识器(CLSID)和接口。该请求由服务控制管理器处理(Service Control Manager,SCM),它是Windows的一部分。SCM负责在服务器计算机上创建和激活COM对象。在DCOM中,SCM将尝试启动远程计算机上的服务器。*************图一*******************  一旦创建了远程的COM服务器,所有的调用将通过proxy和stub对象配置。proxy和stub使用RPC(Remote Procedure Calls,远程过程调用)进行通信,RPC处理所有网络交互。在服务器端,stub对象负责配置,而客户端则由proxy负责。  跨网络的数据传送由RPC负责。实际上,DCOM使用一个扩展类型的RPC,称为对象RPC(Object RPC)或者ORPC。RPC可以运行在多种不同的协议上,包括有TCP/IP,UDP,NetBEUI,NETBIOS和命名管道。标准的RPC协议是UDP(用户数据报协议)。UDP是一个无连接的协议,看来与DCOM这种面向连接的系统配合并不是一个好主意。不过这并不是一个问题,DCOM自动负责管理连接。  你也知道,分布式的COM是通过不同硬件、操作系统和软件组件这样一个复杂的交互完成的。你应该认识到:   a)COM在后面做了很多工作;   b)有许多地方可能出错  在编写时,如果使用Windows95/98系统,仅可使用TCP/IP协议进行DCOM数据传输。这是一个有点讨厌的限制,即使有其它的网络协议,你仍然需要在所有的Windows系统上安装TCP/IP协议。  服务器的改动不大  作为一个程序(EXE)运行的服务器将能够在网络上工作。实际上,将一个服务器转为DCOM方式工作,要做的改动并不大。不过,你要为该服务器加入一些安全性,这需要作一些努力。为了简单,在这里我忽略了安全性。  如果你以前使用的是进程内的服务器,你将需要作一些改变。进程内的服务器是一个DLL,它不可以跨网络载入。一个DLL载入到客户程序的地址空间中,它不可以通过远程连接工作。有一个称为surrogate的工作区,可以将DLL封装为一个可执行的程序,不过,更好的是将服务器转变为一个EXE,要将一个DLL转换为一个EXE,最简单的方法是重新使用ATL向导创建服务器,并且将代码由DLL传送到EXE中。  在我们的例子中,我提供了RemoteServer.exe的源代码,它实现了一个基于EXE的简单DCOM服务器。如果你查看其中的代码,你将发现它是由向导产生的。不过,我在其中加入了两个方法--一个是得到服务器的名字,另一个是得到服务器的系统时间。(若需要源代码,请与我联系)  在编译以上的例子后,我们需要将客户的EXE拷贝到客户计算机。要注意的是,由于它是一个用户自己的接口,因此你还需要一个proxy/stub DLL,并且在客户端和服务端计算机中注册该proxy/stub DLL。如果你使用一个带类库的自动服务器,你还需要将类库拷贝到客户计算机,并且登记它。  你还可以使用OLEVIEW和DCOMCNFG来设置一个远程服务器  实际上,你只需改变寄存器的设置就可以令一个服务器程序远程地运行。有两款微软的工具可做到这一点:OLEVIEW和DCOMCNFG。两款工具都可设置寄存器以让DCOM尝试找到远程计算机上的服务器。你可以在OLEVIEW的Activation标签下输入远程的计算机名字,这样它将在该计算机上被启动。  虽然它可以在旧的非DCOM应用上可行,不过这是一个不太便利的解决方法。我打算还是集中在使用编程的方法来设置远程激活,只要你掌握了它,这种方法将是更灵活的。共5页。 1 2 3 4 5 : 下载本文示例代码


DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六DCOM揭秘之六
阅读(213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~