我一直觉得有些迷惑,不明白为什么一定要用到类工厂(ClassFactory)。
我的初步理解是这样的,用COM类只是声明及定义了一些接口,但是它像抽象类一样是不能直接定义对象的。那么在实际使用COM时,必须生成此COM类的一个实例。所以,就定义了IClassFactory接口,利用它来生成COM类的实例。另外,类工厂是不是COM的一个特殊接口啊?就像IUnknown一样。我看〈vc技术内幕〉时,说注册表注册COM类时,类工厂对象也必须被注册。不是很明白这句话的意思。---接口还要注册么?不知道我的理解对不对啊?刚学COM,请大家给予指点。谢谢!
我的初步理解是这样的,用COM类只是声明及定义了一些接口,但是它像抽象类一样是不能直接定义对象的。那么在实际使用COM时,必须生成此COM类的一个实例。所以,就定义了IClassFactory接口,利用它来生成COM类的实例。另外,类工厂是不是COM的一个特殊接口啊?就像IUnknown一样。我看〈vc技术内幕〉时,说注册表注册COM类时,类工厂对象也必须被注册。不是很明白这句话的意思。---接口还要注册么?不知道我的理解对不对啊?刚学COM,请大家给予指点。谢谢!
IClassFactory说穿了就是专门构造组件的类,这样做是为了抽象,因为客户没有必要知道组件是什么,如果由客户直接构造组件,客户势必要知道组件的信息,com就失去了它的意义了,所以,规定了一个类厂(支持IClassFactory接口),每个组件的类厂都很清楚并且也只清楚该组件的信息,而客户只需要调用com库函数CoCreateInstance就可以了。
下面是流程图:
CoCreateInstance -->> CoGetClassObject -->> DllGetClassObject -->> new ClassFactory
-->>IClassFactory::CreateInstance() -->> new Component