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;
}
- ATL组件模板模拟
- ATL 模板
- ATL布幔下的秘密之模板技术 模板模拟编译时多态
- ATL COM 组件 调用
- 使用ATL设计组件
- atl com组件调用
- ATL库组件
- ATL组件模拟之多接口实现和内部类实现多接口
- ATL-Style模板学习
- ATL---style模板
- ATL模板原理
- ATL组件产生内幕结构图
- ATL开发COM组件心得
- 使用ATL设计组件(vs2008)
- com ATL开发Com组件
- 使用ATL设计组件(vs2008)
- 简单的ATL COM组件
- 使用ATL设计组件(vs2008)
- perl中动态创建access数据库mdb
- 格式化double数据
- JMS(Jboss Messaging)的一点使用心得(七)JBoss invoke-动态创建Queue或者Topic
- Visual Studio 2005.NET中的CLR编程和MFC编程有什么区别?
- Oracle全角変換
- ATL组件模板模拟
- PHP免费空间比较
- eclipse问题:
- 什么是DirectX
- [数组数学]简单的线性数组二维换算公式---贴片应用
- JMS(Jboss Messaging)的一点使用心得(八)JBoss invoke-动态修改Bridge
- Java:对象创建和初始化过程
- Sql Server中通配符的使用
- 在RAD7中开发JSR168 Portlet