摘要:
【ATL的三种线程模型】1、_ATL_SINGLE_THREADED2、_ATL_APARTMENT_THREADED3、_ATL_FREE_THREADED【线程模型的支持】 线程模型的支持,以类为单位,每个类提供2种功能,一个是互斥的加减,另一个是CS。1、CComSingleThreadModel2、CComMultiThreadModel3、CComMultiThreadModelNoCS【深入解析线程模型】【默认线程模型】 默认线程定义代码在atldef.h头文件中,除此之的外,以上代码在atlbase.h中,另外,CS相关部分前文已经解析。
阅读全文
posted @ 2011-05-10 18:00
Tekkaman
阅读(1803)
推荐(2)
摘要:
【ATL中的各种CriticalSection】1、CComCriticalSection,最基本CriticalSection,只是简单地包装了一下Windows CirticalSection。2、CComAutoCriticalSection,在构造和析构函数中初始化CriticalSection,不允许自由Init和Tern。3、CComSafeDeleteCriticalSection,用来保证cs不会被反复的初始化和删除,另外保证自动释放资源。亦即,你随便用吧,你忘了释放cs时,我来帮你擦屁股,你擦了的时候,我就不帮你擦了。4、CComAutoDeleteCriticalSecti
阅读全文
posted @ 2011-05-10 12:45
Tekkaman
阅读(1812)
推荐(2)
摘要:
1、在返回之前调用AddRef。 对于那些返回接口指针的函数,在返回之前应用相应的指针调用AddRef。这些函数包括QueryInterface和CreateInstance。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。2、使用完接口之后调用Release。 在使用完某个接口之后应调用此接口的Release函数。3、在赋值之后调用AddRef。 在将一个接口指针赋给另一个接口指针时,应调用AddRef。换句话说,在建立接口的另一个引用之后应增加相应组件的引用计数。
阅读全文
posted @ 2011-05-10 09:09
Tekkaman
阅读(656)
推荐(2)
摘要:
【基本知识】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 的建立】根据【基本知识】,很容易分析出,上文定义了
阅读全文
posted @ 2011-05-05 09:17
Tekkaman
阅读(947)
推荐(2)
摘要:
内存管理是C++中永恒的话题, 磨刀不误砍柴功,先把内存管理这块给搞个透彻,有助于对ATL的整体理解和把握。打开<atlalloc.h>,发现它只包含了两上头文件<windows.h>、<ol2.h>,显然<atlalloc.h>是ATL中少有的一个不依赖于任何ATL、MFC头文件的库文件。因为<atlalloc.h>不依赖于任何其它同类库文件,所以对<atlalloc.h>的分析相比CString就容易了很多,不需要分析复杂的文件间关系。那么,我们从文件的第一行开始,一点一点地分析<atlalloc.h>到底
阅读全文
posted @ 2011-04-23 20:26
Tekkaman
阅读(1764)
推荐(2)
摘要:
【LocalAlloc 和 GlobalAlloc】 16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而LocalAlloc
阅读全文
posted @ 2011-04-22 09:37
Tekkaman
阅读(3134)
推荐(2)
摘要:
上文分析了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
阅读全文
posted @ 2011-04-20 19:07
Tekkaman
阅读(11066)
推荐(9)
摘要:
话说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 都干了什么
阅读全文
posted @ 2011-04-20 17:35
Tekkaman
阅读(7853)
推荐(3)
摘要:
inl 文件是内联函数的源文件。内联函数通常在c++头文件中实现,但有的时候内联函数较多或者出于一些别的考虑(使头文件看起来更简洁等),往往会将这部分具体定义的代码添加到INL文件中,然后在该头文件的末尾将其用#include引入。由此也可以看到inl文件的例外一个用法的影子——模板函数、模板类的定义代码的存放。对于比较大的工程来说,出于管理方面的考虑,模板函数、模板类的声明部分一般存放在一个或少数几个文件中,而将其定义部分存放在inl文件中,然后在相应的头文件中包含进来。 Google代码规范中也谈到了inl文件,需要阅读的读者可以从这里阅读Google代码规范,http://google.
阅读全文
posted @ 2011-04-20 10:53
Tekkaman
阅读(3480)
推荐(0)
摘要:
要想理解好某个库的整个系统,我们需要准确地知道我们当前所阅读的代码位于哪一个库目录中。譬如WTL和ATL的头文件常常容易让初学者混淆。这里我们要分析两个类,CAtlStringMgr(存在于atlstr.h中)和 CStringData(存在于atlsimpstr.h中)。首先给出类关系图:(因画图水平有限,下图中CAtlStringMgr到IAtlStringMgr的继承线应该改为实现线)1、使用到的设计模式 这里我看到一个,是策略模式。细看ATL中,有若干实现IAtlMemMgr接口的类,分别为各个实现类。CAtlStringMgr通过IAtlMemMGr指针来引用,因而可以随意使用各个内
阅读全文
posted @ 2011-04-18 18:51
Tekkaman
阅读(2804)
推荐(1)
摘要:
阅读组内代码也好、开源代码也好,在OOP程序设计中,对代码中各个类的理解至关重要。经过大量的阅读与分析后,发一些小技巧可以加快与加强自己对代码的理解,现整理如下: 如何剖析一个类: 1、先看本类继承了哪些基类和实现了哪些接口。 类的第一行往往包含的是继续基类的信息以及实现接口的信息,所以在一开始就要
阅读全文
posted @ 2011-04-18 16:32
Tekkaman
阅读(2394)
推荐(3)