现在的位置: 首页 > 综合 > 正文

用ATL建立轻量级的COM对象(六)

2013年10月09日 ⁄ 综合 ⁄ 共 956字 ⁄ 字号 评论关闭

第一部分:为什么要使用ATL。

第二部分:起步篇。

第三部分:实现IUnknown。

第四部分:实现接口。

第五部分:不要过分抽象。

输出你的类

实现了 CComObject ,你就有足够的条件用 C++ new 操作符创建 COM 对象。不过这样做没有什么实用价值,因为毕竟外部客户端使用 CoCreateInstance 或 CoGetClassObject 创建类实例。也就是说,你必须为每个外部类输出类对象。幸运的是ATL分别在它的 CComClassFactory 和 CComClassFactory2 类中提供了缺省的 IClassFactory 和 IClassFactory2接口实现。

CComClassFactory 不是模板驱动类,但其中有一个函数指针作为数据成员,使用这个函数可以创建对象。ATL提供了一个类模板家族,它们都有一个单独的静态方法 CreateInstance,由 Creators 调用,Creators 提供正确的语义来从 CComClassFactory 创建基于 CComObjectRoot 的对象。下面的这段代码展示了缺省的创建机制:CComCreator,它产生一个模板化的类实例,并用 ATL 中标准的 FinalConstruct 来顺序初始化对象。

01.ATL
Creator
02. 
03. 
04.template  class CComCreator
{
05.public:
06.static HRESULT WINAPI
CreateInstance(
void*
pv, REFIID riid, 
LPVOID*
ppv) {
07.HRESULT hRes
= E_OUTOFMEMORY;
08.T1*
p = NULL;
09.ATLTRY(p
new T1(pv))
10.if (p
!= NULL) {
11.p->SetVoid(pv);
12.p->InternalFinalConstructAddRef();
13.hRes
= p->FinalConstruct();
14.p->InternalFinalConstructRelease();
15.if (hRes
== S_OK)
16.hRes
= p->QueryInterface(riid, ppv);
17.if (hRes
!= S_OK)
18.delete p;
19.}
20.return hRes;

抱歉!评论已关闭.