仔细看了下ATL,一直想知道,明明我写com的时候根本没有写这个什么类厂啊,
怎么就可以通过类厂来创建一个com对象实例,
原因就是CComCoClass中间有这个一个宏DECLARE_CLASSFACTORY,这个宏别的不干,
就是来建立类厂的,
它会做这么一个声明
#define DECLARE_CLASSFACTORY_EX(cf) typedef ATL::CComCreator< ATL::CComObjectCached< cf > > _ClassFactoryCreatorClass;
cf在是什么
#define DECLARE_CLASSFACTORY() DECLARE_CLASSFACTORY_EX(ATL::CComClassFactory)
cf就是我们的类厂的真正原因
它就是ATL::CComClassFactory
直接使用这个CComCreator的CreateInstance方法直接放入那个OBJECT_ENTRY_AUTO宏定义的结构中的
那么pfnGetClassObject中就可以了,
也就是说,pfnGetClassObject实际是ATL::CComCreator< ATL::CComObjectCached< ATL::CComClassFactory > >的CreateInstance函数,
但不同的类厂怎么会是一样的呢,
问题就在于这个类厂类中有个_ATL_CREATOFUNC指针,这个指针是会在CComCreator在调用SetVoid的时候把
我们自己创建类的CComCreater的CreateInstance 放入,这样,这个类厂就自己和指定类的创建挂钩了,
nb啊,命令模式用的这么nb啊。