ATL组件模板模拟

19 篇文章 0 订阅

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;
}

 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值