CComCreator代替new来创建组建实例
来源:互联网 发布:python datetime 转秒 编辑:程序博客网 时间:2024/05/18 18:01
ATL中的 CComCreator 代替new 来创建组建实例。
template <class T1>
class CComCreator {
public:
static HRESULT WINAPI CreateInstance(void* pv, REFIID riid,
LPVOID* ppv) {
ATLASSERT(ppv != NULL);
if (ppv == NULL)
return E_POINTER;
*ppv = NULL;
HRESULT hRes = E_OUTOFMEMORY;
T1* p = NULL;
ATLTRY(p = new T1(pv))
if (p != NULL) {
p-> SetVoid(pv);
p-> InternalFinalConstructAddRef();
hRes = p-> _AtlInitialConstruct();
if (SUCCEEDED(hRes))
hRes = p-> FinalConstruct();
if (SUCCEEDED(hRes))
hRes = p-> _AtlFinalConstruct();
p-> InternalFinalConstructRelease();
if (hRes == S_OK)
hRes = p-> QueryInterface(riid, ppv);
if (hRes != S_OK)
delete p;
}
return hRes;
}
};
由上面可以看出CComCreator中的CreateInstance实现了多步骤构造
1。new
2。SetVoid(pv) -- 在创建类厂实例时传递组建实例创建函数指针(其实就是组件中的_CreatorClass::CreateInstance)
3。FinalConstruct -- 在实现组建包容或聚合时创建内部组件
4。QueryInterface --获得组件的接口指针
由此可见,CComCreator不仅实现了new,而且同时考虑到 standalone or aggregated 等多种组建创建的需求。
而且,使用起来也必new简单。
例如:
STDMETHODIMP CAviary::CreatePenguin(IBird** ppbird) {
typedef CComCreator < CComObject <CPenguin> > PenguinCreator;
return PenguinCreator::CreateInstance(0, IID_IBird, (void**)ppbird);
}
为了实现组建创建实现的通用性,ATL将其放在了CComCoClass中。
要实现可创建的组件,必须继承CComCoClass类。
class CPenguin : ...,
public CComCoClass <CPenguin, &CLSID_Penguin> , ... {...};
其中的DECLARE_AGGREGATABLE(T)定义:
#define DECLARE_AGGREGATABLE(x) public:/
typedef ATL::CComCreator2 < ATL::CComCreator < ATL::CComObject < x > > , ATL::CComCreator < ATL::CComAggObject < x > > > _CreatorClass;
其中的_CreatorClass就用于组件实例的创建。
其中的DECLARE_CLASSFACTORY()定义:
#define DECLARE_CLASSFACTORY() DECLARE_CLASSFACTORY_EX(ATL::CComClassFactory)
#define DECLARE_CLASSFACTORY_EX(cf)
typedef ATL::CComCreator < ATL::CComObjectCached < cf > > _ClassFactoryCreatorClass;
其中的_ClassFactoryCreatorClass就用于组件类厂的创建。
也就是说组件类厂和实例的创建都用到了CComCreator。
而其CreateInstance的过程是一样的,唯一的不同就是:CreateInstance参数pv不同。
static HRESULT WINAPI CreateInstance(void* pv, REFIID riid, LPVOID* ppv) {
...
}
对于类厂:pv --为组件实例创建函数指针。
对于组件:pv --为NULL。
从_ClassFactoryCreatorClass定义可以看出,对于不同组件_ClassFactoryCreatorClass是一样的.不同的的地方在于CreateInstance参数pv不同。也就是对不同组件,创建类厂时,传递不同的组件实例创建函数指针.
- CComCreator代替new来创建组建实例
- 使用Builder模式代替来创建实例
- JavaScript面向对象实例——创建日志调试对象来代替alert函数进行调试
- 工厂模式解决如何不通过new来创建实例对象的方法
- 从ICLassFactory 为 CLSID的COM组建创建实例失败
- 从ICLassFactory 为 CLSID的COM组建创建实例失败
- 从ICLassFactory 为 CLSID的COM组建创建实例失败
- 用Activator .CreateInstance代替new实现类的实例化
- 用Activator .CreateInstance代替new实现类的实例化
- 用Activator .CreateInstance代替new实现类的实例化
- Block实例------用Block代替delegate来传递值
- 使用new来创建动态结构
- Objective-C 用new来创建对象
- 使用new来创建动态数组
- 使用联合(UNION)来代替手动创建的临时表
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转
- DataGrid 添加 RadioButton
- CnineGrid 类
- 论J2EE程序员的武功修为
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- static_cast在ATL中很常见.它是实现模版形式多态的关键.
- CComCreator代替new来创建组建实例
- CAtlModule类的实现
- 怎样删除*.sys文件
- 经典的C++库
- javascript:如何获得鼠标在屏幕上的位置
- SAP Java Connector(JCo) (转)
- 利用反射动态调用类成员
- 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
- 今天感冒了