再第二篇文章里 提到了IClassFactory (类工厂)
这也是一个接口,如果com组件的类想注册到系统中,就必须实现这个接口。正如它的名字所暗示的意思一样---类工厂,它的作用就像一个工程一样,来创建用户所要创建的对象并且返回请求的接口指针。
它有两个方法
IClassFactory::CreateInstance // 创建未初始化的对象。 IClassFactory::LockServer //锁定内存中打开的对象应用程序。 这样就可以更快地创建实例。
为什么需要实现IClassFactory接口呢,我们从COM接口的获取过程说起,创建COM对象并获取接口的标准方式是通过使用COM提供的一个函数CoCreateInstance,第一个参数是实现COM接口的组件类(coclass)的CLSID(本质是GUID),第二个参数一般为空,如果你创建的COM对象是聚集的(有的地方翻译是聚合的),就需要设置这个参数。第三个参数指定对象运行的上下文,前面我们一直说的,就是In-process Sever,也就是一个DLL,因此,我们在这里使用的是CLSCTX_INPROC_SERVER ,这个参数是一个枚举变量,更多设置,参考msdn。第三个参数是你需要的接口的ID(本质也是GUID),最后一个参数是一个双指针,如果对象支持这个接口,CoCreateInstance就会创建对象并返回请求的接口。在CoCreateInstance内部是怎么回事呢,其实有两个过程,首先是使用CoGetClassObject创建在COM DLL中实现IClassFactory接口的对象,并获取它的IClassFactory接口,然后调用这个接口的CreateInstance方法创建你传递的你要创建的对象的CLSID,也就是你调用CoCreateInstance时传递的第一个参数,以及要获取接口的id和一个双指针参数,由IClassFactory接口来帮助我们创建我们需要的对象。因此我们要实现IClassFactory接口。