第一部分:为什么要使用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;