ATL组件模板模拟

来源:互联网 发布:易遨软件 编辑:程序博客网 时间:2024/06/07 00:11

ATL创建组件方便快捷,但是内部结构层次比较复杂,使用了很多的模板类。我在分析原理过程中,对其简化如化。

组件实现了某个结口,对于创建,基本生存周期管理及接口查询,尽量让宏去处理或是父类去处理。

对于创建通过每个组件的内部对象 Xobj来实现。


读者可以创建一个mfc的控制台程序,把下面的程序拷去执行。

#include "stdafx.h"
#include "wtypes.h"
#include "objbase.h"
#include "initguid.h"
class IU
{
public:
 virtual ULONG AddRef() =0;
 virtual ULONG Release() =0;
 virtual ULONG QueryInterface(REFIID iid, void **pThis)=0;
};

//////////////////////////////////////////////////////////////////////////
//模板多重继承类
//创建类
template<class Base>
class CoObject : public Base
{
 ULONG m_cbRef;
public:
 virtual ULONG AddRef()
 {
  m_cbRef ++;
  return m_cbRef;
 }
 virtual ULONG Release()
 {
  m_cbRef --;
  if(m_cbRef == 0)
   delete this;
  return m_cbRef;
 }
 virtual ULONG QueryInterface(REFIID iid, void **ppVoid)
 {

  return 0;
 }
 CoObject()
 {
  m_cbRef = 0;
 }
//  static ULONG CreateInstance(REFIID riid, void **ppVoid)
//  {
//   *ppVoid = new Base();
//   return 0;
//  }
};
template <class Base>
class CoXCreate
{
public:
 static ULONG CreateInstance(REFIID iid, void **ppVoid)
 {
  Base *p= new Base();
  p->AddRef();
  *ppVoid = p;
  return 0;
 }
};
#define DECLARE_CC_XX(x) public:/
typedef CoXCreate< CoObject <x> > Xobj;


#define BEGIN_CC_INTER()/
public:/
 virtual ULONG AddRef() = 0;/
 virtual ULONG Release() = 0;/
 virtual ULONG QueryInterface(REFIID iid, void **ppVoid) = 0;


template<class TBase>
class Create
{
public:
 typedef TBase _TClass;
 
 static ULONG CreateInstance(REFIID iid, void ** ppVoid)
 {
/*  _TClass *p;*/
//   p = new _TClass();
//   *ppVoid = p;
//   p->AddRef();
  TBase::Xobj::CreateInstance(iid, ppVoid);
//   p = (_TClass *)(*ppVoid);
//   p->AddRef();
  return 0;
 }

};

class IDeal : public IU
{
public:
 virtual void H1() = 0;
};
class YDeal : public IU
{
 virtual void HH() = 0;
};
class CXDeal : /*public RefCount, */
   public Create<CXDeal>,
   public IDeal
 
{
public:
 CXDeal(){}
 virtual void H1()
 {
  printf("Hello");
 }
 DECLARE_CC_XX(CXDeal);
    BEGIN_CC_INTER();
};

class CYDeal : /*public RefCount,*/
  public Create<CYDeal>,
  public YDeal
{
public:
 CYDeal(){}
 virtual void HH(){
  printf("Hello");
 }
 DECLARE_CC_XX(CYDeal);
   BEGIN_CC_INTER();
};

void Test3()
{
 GUID guid;
 CXDeal *p;
 CXDeal::CreateInstance(guid, (void **)&p);
 p->H1();
 p->Release();
 CXX<CXDeal>pp ;
 CXDeal::CreateInstance(guid, (void **)&pp);
  pp->H1();

 CXX<CYDeal>py;
 CYDeal::CreateInstance(guid, (void **)&py);
 py->HH();
}
//模板多重继承类结构
//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
 //多重继承,继承自模板
 Test3();

 printf("Hello World!/n");
 return 0;
}