ATL之什么是套间
摘要:【什么是套间】 套间(APARTMENT)是什么?套间是线程的执行环境。根据这个,我一条一条来解释一下跟套间有关的文章里一些名词和术语是个什么意思。1、STA,单线程套间,真实意思是单线程执行环境。每个线程都有个自己的套间。2、MTA,多线程套间,真实意思是多线程执行环境。所有线程共享一个MTA。3、STA和MTA的差别是什么?除了STA和MTA的共同点之外,STA建立了一个窗口,通过窗口的消息机制来保证本线程COM对象方法的同步调用,MTA基本什么也不做。这是唯一的差别。4、STA和MTA的共同点是什么?都提供通过Proxy访问其它套间的服务,都提供其它套间访问自己时的Stub服务。5、每个
阅读全文
ATL之眼花缭乱的CComObject
摘要:【眼花缭乱的CComObject】1、CComObject :为独立激活的COM组件提供服务,功能包涵: (1)锁服务器。 (2)正常的引用计数。 (3)正常的QueryInterface。2、CComAggObject :为被聚合激活的COM组件提供服务,功能包涵: (1)锁服务器。 (2)包容接口实际类。 (3)正常的引用计数。 (4)将调用转发给内部包容对象的QueryInterface。(除了IUnknown请求外)3、CComContainedObject :为被聚合海派的COM组件提供服务,功能包涵: (1)将调用转发给外部组件的引用计数。 (2)将调用转发给外部组件的QueryI
阅读全文
ATL之如何聚合一个组件
摘要:【如何聚合一个组件】1、Add an IUnknown pointer to your class object and initialize it to NULL in the constructor.2、Override FinalConstruct to create the aggregate.3、Use the IUnknown pointer you defined as the parameter to the COM_INTERFACE_ENTRY_AGGREGATE macro.4、Override FinalRelease to release the IUnknown p
阅读全文
ATL线程模型解析
摘要:【ATL的三种线程模型】1、_ATL_SINGLE_THREADED2、_ATL_APARTMENT_THREADED3、_ATL_FREE_THREADED【线程模型的支持】 线程模型的支持,以类为单位,每个类提供2种功能,一个是互斥的加减,另一个是CS。1、CComSingleThreadModel2、CComMultiThreadModel3、CComMultiThreadModelNoCS【深入解析线程模型】【默认线程模型】 默认线程定义代码在atldef.h头文件中,除此之的外,以上代码在atlbase.h中,另外,CS相关部分前文已经解析。
阅读全文
ATL中的各种CriticalSection
摘要:【ATL中的各种CriticalSection】1、CComCriticalSection,最基本CriticalSection,只是简单地包装了一下Windows CirticalSection。2、CComAutoCriticalSection,在构造和析构函数中初始化CriticalSection,不允许自由Init和Tern。3、CComSafeDeleteCriticalSection,用来保证cs不会被反复的初始化和删除,另外保证自动释放资源。亦即,你随便用吧,你忘了释放cs时,我来帮你擦屁股,你擦了的时候,我就不帮你擦了。4、CComAutoDeleteCriticalSecti
阅读全文
正确地使用引用计数
摘要:1、在返回之前调用AddRef。 对于那些返回接口指针的函数,在返回之前应用相应的指针调用AddRef。这些函数包括QueryInterface和CreateInstance。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。2、使用完接口之后调用Release。 在使用完某个接口之后应调用此接口的Release函数。3、在赋值之后调用AddRef。 在将一个接口指针赋给另一个接口指针时,应调用AddRef。换句话说,在建立接口的另一个引用之后应增加相应组件的引用计数。
阅读全文
巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立
摘要:【基本知识】1、#pragma section,建立一个section。下例中,ATL是section名,_a是section中的的段名,段默认大小为104H,另外默认段内数据初始化为0。意即一个section可以包含多个名字不同的段。不懂section的请查阅PE文件结构。2、合并两个Section3、allocate将指定的变量放在指定的section中的指定的段中。4、VC编译器属性,假设定义了同一section的三个段,ATL$_a、ATL$_b、ATL$_c,则这三个段在section内会按名称顺序依次排列。【ATL OBJ_MAP 的建立】根据【基本知识】,很容易分析出,上文定义了
阅读全文
完全解析<atlalloc.h>
摘要:内存管理是C++中永恒的话题, 磨刀不误砍柴功,先把内存管理这块给搞个透彻,有助于对ATL的整体理解和把握。打开<atlalloc.h>,发现它只包含了两上头文件<windows.h>、<ol2.h>,显然<atlalloc.h>是ATL中少有的一个不依赖于任何ATL、MFC头文件的库文件。因为<atlalloc.h>不依赖于任何其它同类库文件,所以对<atlalloc.h>的分析相比CString就容易了很多,不需要分析复杂的文件间关系。那么,我们从文件的第一行开始,一点一点地分析<atlalloc.h>到底
阅读全文
ATL、MFC、WTL CString 的今生前世
摘要:上文分析了ATL、MFC CString的设计和实现,我们不禁会疑问,为什么ATL和MFC的CString头文件要搅在一起?上文的分析有些杂乱,我们通过一张图来更加清晰的观察,如下: 上图中,用圈圈住的头文件表示ATL头文件,没被圈的代表MFC头文件。另外,在头文件旁边字符,表示各个头文件中实现的类。 现在让我们仔细观看,整个貌似平衡的设计中,其实有着很多的不平衡。我想问: 1、为什么MFC头文件cstringt.h要包含atl头文件atlsimpstr.h?为什么ATL头文件要包含cstringt.h?ATL搞ATL的,MFC搞MFC的,各不相干,起不更好? 2、ChTraitOS 放在 a
阅读全文
剖析ATL、WTL CString的实现
摘要:话说CString这个东西困扰了很多年轻人,因为它会引起诡异的编译错误,今天跟着我一起来深入ATL、WTL头文件,来把这个东西搞个清清楚楚。【涉及到头文件】 ATL: atlstr.h, atlsimpstr.h MFC : cstringt.h、afxstr.h WTL : atlmisc.h ATL和MFC有关剪不断理还乱的关系,为了更容易分析,我们先要理清这四个头文件间的关系。观察相互间观察顺序,可以得出: atlstr.h引用cstringt.h,cstring引用atlsimpstr.h,afxstr.h引用cstringt.h,由此可得出下图:【atlsimpstr.h 都干了什么
阅读全文