首页 / 软件开发 / C语言 / 用C实现的一个基本COM接口IFoo(二)
用C实现的一个基本COM接口IFoo(二)2010-06-17 C++博客 行百里者半九十在C实现COM接口系列1中实现的com接口IFoo与使用它的客户耦合在一起,没有实现在各自分离的模块,因此不符合模块化编程思想。本期添加类厂支持,以使接口的实现与接口的使用相分离。---------------------------------------------------类厂的作用到底是什么?将接口的实现与客户使用分离开来吗?不尽然。使用CoCreateInstance,客户可以完全不必知道类厂的存在,而创建组件,获取组件实现的接口并使用。即COM库可以完全抛开类厂的概念,而是提供一个这样的函数原型:CoCreateObject(REFID rclsid,……,REFID riid,void **ppItf);用户在调用的时候可以对riid提供IID_Unknown或者特定于该对象的一个接口,直接获取该对象的IUnknown或特定的接口指针。可以看到,这正是CoCreateInstance所作的事情。1 类厂提供了间接创建类对象的方式:用户可以先获取并持有类厂接口指针,通过该指针所指向的类厂接口创建类对象。适用于需要创建多个(或重复创建)类对象的地方,减少了每次都要定位对象库并把对象库装入内存的开销。2 类厂提供了保证组件库留在内存不被卸载出去的另一种方法:类厂接口函数LockServer.组件库维护一个库范围计数器,只有该计数器为0时,组件库才允许自己被卸载出内存。(与此相对,引用计数是类对象范围的,通过该类实现的各个接口来维护。如果一个类对象的引用计数达到0,那么该对象占有的内存就被释放,该对象上的接口指针也不再有效。)除了调用LockServer锁定组件库以外,当创建的组件个数大于0时,组件库也不能被卸载。也可以说,调用一次LockServer()的作用相当于创建了一个组件。-----------------------------------------------------------------------客户一侧:1 使用一个接口需要知道哪些信息?备选:接口IID类对象(类厂)CLSID(或ProgID)接口函数原型(参数个数,类型,返回值)实现接口组件的线程模型(进程内、进程外、远程)?类型库typelib信息?服务一侧:2 实现一个组件和接口以供客户调用,需要提供哪些东西?备选:所有客户使用组件和接口所需的内容额外的还有:--------------------------------------------------------------------为dll添加。def文件与直接在需要导出的函数定义处指定_declspec( dllexport )有区别吗?如果有是什么区别?