深入DCOM之STA

原创 2003年07月16日 10:59:00
            COM最初被开发出来的时候Windows还不支持线程,所以COM最初不支持线程,之后随着线程在Windows系统中的普及,COM也提供了对线程的支持。现在COM支持两种线程模型,一种用于用户驱动的图形用户界面应用程序,一种用于不显示用户界面的工作者组件。

为了防止非线程安全的代码,COM还提供了线程安全支持,基本元素是“公寓”。COM中定义了两种类型的公寓:单线程公寓(STA)和多线程公寓(MTA)。本文主要介绍STA

顾名思义,每各单线程公寓就是只能有一个线程的公寓,而每个进程可以包含任意个单线程公寓。任何对单线程公寓中对象的调用都将被自动地同步并使用Windows地消息队列来分发,所以任何支持STA模式地对象都必须包含一个消息循环。虽然STA模式依赖于Windows消息队列,但这并不意味着STA模式中地组件需要显示用户界面,COM会自动为每个STA创建一个隐藏地窗口,这个结构解决了多个客户程序同时调用一个STA中地对象地同步问题。

组件通过调用CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)来声明支持STA模式,STA是在其线程中实例化地所有对象地拥有者,所有对这些对象地调用都将在创建它们地线程中执行,因此在组件中调用GetCurrentThreadIdAPI时得到的可能不是我们想要地结果。同样,在客户端的任何线程都要通过调用CoInitializeEx来创建STA,任何在该线程中创建地对象都将成为其STA的成员,而且对象指针不能直接通过全局变量在其它的公寓中使用。

DCOM中客户端和组件可以在网络中不同地计算机上运行。首先客户线程调用远程组件在本地的ProxyProxy将调用参数序列化调用IrpcChannelBuffer::SnedReceive创建新线程将打包数据通过Rpc传送到服务器,之后客户端会在消息循环中等待返回信息,服务器接收到数据后发送消息到组件对象的隐藏窗口队列中,在此组件的Stub接收消息并将参数解包,再调用实际的组件对象来完成请求。这个工作机制中参数打包的过程成为marshaling

COM也提供了marshal机制用于在一个公寓中使用另一个公寓中的对象接口指针。CoMarshalInterThreadInterfaceInStream将一个接口指针转换为一个流对象,流对象可以通过全局变量传递给另一个公寓,并调用CoGetInterfaceAndReleaseStream将该流对象转换为组件对象接口指针。

DCOM 揭秘之四

我们已经讨论了DCOM的基本要点,了解了如何创建一个简单的DCOM服务器和一个相关的客户端。你也可以看到这个基本的过程是非常简单的---ATL向导处理了服务器端的大部分细节,要激活服务器,你只需要在客...
  • embededvc
  • embededvc
  • 2014年01月09日 17:49
  • 685

DCOM揭秘之五

理解ATL产生的代码   我们服务器端DLL的源代码是由ATL产生的。对于许多人来说,可以完全不用了解ATL创建的代码。不过,对于一些喜欢寻根究底的人来说,这是不可以接受的。这里就介绍一下由AT...
  • embededvc
  • embededvc
  • 2014年01月09日 17:52
  • 748

深入DCOM之MTA

 运行再MTA中的线程不需要Windows消息机制,因为COM直接通过对象的v-table来调用对象的接口,所以在MTA中的COM对象没有同步机制,需要自己通过临界区、事件等机制来实现同步,COM对象...
  • liagl
  • liagl
  • 2003年07月16日 10:57
  • 700

深入DCOM之DCOM的发展史

            经过10多年的发展,Windows已经成为包含许多子系统的系统,为了使Windows得到更广泛的接受,Microsoft需要一个计划,使得添加新的子系统不会增加开发人员的学习难...
  • liagl
  • liagl
  • 2003年07月11日 06:40
  • 1310

COM 经验的八个教训(6):DCOM 不适于防火墙

DCOM 不适于防火墙关于 DCOM 特性和功能的一个常见问题是:“它能跨 Internet 工作吗?”DCOM 能够很好地跨 Internet 工作,只要将它配置为使用 TCP 或者 UDP,并且通...
  • juststone
  • juststone
  • 2005年03月12日 10:57
  • 2392

DCOM揭秘

http://www.pcdog.com/p/html/2004927/27920042820_1.htm Distributed COM --跨网络工作  DCOM代表的是“Distributed(...
  • naive1010
  • naive1010
  • 2005年04月29日 16:06
  • 3638

OPC-DCOM配置 2

OPC-DCOM配置 注意事项:1. 服务器端和客户端的防火墙应关闭,或者设置防火墙的例外程序                   2. 服务器端和客户端用相同的用户名和密码登录系统 OpcEn...
  • zhougynui
  • zhougynui
  • 2016年05月26日 17:16
  • 1662

【三层架构】——COM/DCOM初识

背景:在学习三层架构的时候,知道三层分为UI层(表现层)、BLL层(业务逻辑层)、DAL层(数据访问层),相对于传统的二层架构(客户端和数据库)来说,多了一个中间层BLL(业务逻辑层),处于UI层和D...
  • zt15732625878
  • zt15732625878
  • 2016年03月23日 16:08
  • 1655

COM/DCOM开发之远程进程外组件(DCOM)

一 目的 使用VC++的ATL编程实现远程进程外组件。同时实现客户端这些组件的调用。二 要求 1)使用C++语言实现远程进程外组件,组建提供加、减、乘、除、判断是否素数等计算服务;客户端部分包括录入和...
  • u011402642
  • u011402642
  • 2015年06月16日 12:03
  • 570

DCOM揭秘之一

传说中的COM,很难明,咬牙切齿……转载天极的一篇文章,说得稍微易懂点,但依然还是稀里糊涂,不懂……              COM的基本要素         首先要弄懂COM是怎...
  • embededvc
  • embededvc
  • 2014年01月09日 17:57
  • 827
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入DCOM之STA
举报原因:
原因补充:

(最多只允许输入30个字)