zoukankan      html  css  js  c++  java
  • ATL COM初探(1)

    我没有看过任何的COM书籍,以下总结均是我个人在ATL框架下的实验所得,如有错误望指正。目前的实验都是单进程中的,至于跨进程的实验还未进行。

    Apartment:

    这是一个抽象的概念,我简单的将其理解为作用域(COM对象的生存空间)。可以分为Single-Threaded Apartment(STA)和Multi-Threaded Apartment(MTA),至于Neutral Apartment, Thread Neutral Apartment, Neutral Threaded Apartment(NA, TNA, NTA)还没接触过。一个进程中可以存在多个STA,但只能存在一个MTA。创建COM对象所需要的Apartment类型不存在的时候,系统会自行创建。

    主STA:

    在进程中没有任何STA的情况下,第一个初始化的STA(包括之前存在STA但已经退出的情况)称为主STA。在获取(创建)单线程COM对象时,如果在没有主STA的情况下(哪怕存在STA,但主STA退出了),系统会向RPC申请一个线程来创建一个主STA,换句话说就是STA是无法改变自身的主从属性的,主从属性从初始化的时刻其就决定了。系统进行同步的STA至少需要一个消息循环,否则代理对象会被阻塞(系统创建的STA会自带一个消息循环)。

    单线程COM:

    只能存在于主STA,在非主STA中系统会使用代理对象进行访问并利用窗口消息进行同步,也就是说只有主STA得到的是原始指针,其他的Apartment得到的均为代理指针。如果我们想将某个COM对象约束在某个线程中,那么这个模型是很适合的。只要这个线程初始化关联主STA,那么这个模型的COM对象都会存在于这个线程了(因为一个STA作用域是不能跨线程的)。

    单元COM:

    存在于STA,在非所属STA中系统会使用代理对象进行访问并利用窗口消息进行同步,也就是说只有在STA中创建得到的是原始指针,Marshal得到的都是代理指针,MTA中创建得到的也是代理指针。

    两者COM:

    STA和MTA创建均得到原始指针。在与对象的创建不同的Apartment中得到的将是代理指针(可以指定得到原始指针,但这会失去系统对STA对象的访问同步),若创建的是STA对象,那么系统会利用窗口消息进行同步;若创建的是MTA对象,系统不会进行同步。

    自由COM:

    只存在于MTA,在STA中创建或者Marshal得到的都是代理指针,但系统不会进行同步。在MTA中创建和Marshal得到的都是原始指针。

    中性COM:

    STA和MTA创建均得到代理指针。Marshal得到的代理指针均为同一个指针,系统不会进行同步。只能得到代理指针可能是因为其只存在于NA中的缘故吧。

    By Evil.Ghost
  • 相关阅读:
    在Xampp中添加memache扩展
    使用PHP中的curl发送请求
    php开启openssl扩展
    chisel初见2
    chisel初见
    数字IC设计之DC(二):DC设置、库和对象
    数字IC设计之DC(一):DC简介
    IC基础(八):数字电路设计中常用的算法
    IC基础(七):FPGA为什么与ASIC频率差异巨大?
    IC基础(六):时序分析过程需要的相关计算以及处理方法
  • 原文地址:https://www.cnblogs.com/EvilGhost/p/ATL_COM_1.html
Copyright © 2011-2022 走看看