• 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
  • 相关阅读:
    【模板整合计划】高阶数据结构
    【模板整合计划】高阶数据结构—线段树
    主席树【权值线段树】(转)
    Flask系列(二) 模板 templates
    用java实现Shazam 译文
    [转] 研究云计算与海量数据处理方向建议看的论文列表
    程序员应知 如何分析海量数据
    大数据技术大会
    android监控网络状态
    HP(惠普)大中华区总裁孙振耀退休感言
  • 原文地址:https://www.cnblogs.com/EvilGhost/p/ATL_COM_1.html
Copyright © 2020-2023  润新知