1.CoCreateInstance的不灵活.
 
  我们知道 CoCreateInstance创建组件的过程是:传给他一个CLSID,然后它创建相应的组件.,并返回所请求接口的指针,.CoCreateInstance没有提供一种可以控制组件创建过程的的方法.
 
  存在问题: 我们不能控制组件创建过程.
  解决方案: 使用一个专门创建组件的组件,既 类厂.

2.类厂.

 实际上CoCreateInstance并没有创建组件,而是创建了一个被称为类厂的组件.
 类厂唯一功能就是创建其他组件.

 精确点讲就是.某个特定类厂将创建某个特定CLSID相应的组件. 客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制. 创建组件的标准接口是 IClassFactory,用CoCreateInstance创建的组件实际上是通过IClassFactory来创建的.

3.CoGetClassObject

要创建一个组件,首先要创建类厂本身.

   CoCreateInstance()用来创建与指定CLSID的组件,并返回指向组件某个接口的指针.
   与CoCreateInstance类似,用CoGetClassObject() 来创建与指定CLSID的类厂,并返回指向类厂某个接口的指针.

  函树定义如下:
 
  HRESULT __stdcall 用CoGetClassObject(

   const CLSID & clsid,
   DWORD  dwClsContext,    //server context
   COSERVERINFO *pServerInfo,  //Resevred for DCOM
   const IID &iid,
   void ** ppv
);

 客户用 CoCreateInstanc 所返回的指针来创建所需的组件,这个指针通常是一个IClassFactory指针.
 
 3.IClassFactory
 
 类厂所支持的用于创建组件的标准接口是 IClassFactory.大部分组件可以通过它来创建.
 声明如下:
  
 interface IClassFactory :IUnknown
 {
  HRESULT stdcall  CreateInstace(IUnknown * pUnknownOuter,
                  const IID &iid,
                  void **ppv);
  HRESULT stdcall LockServer(bool bLock);
  };
  
 4.为什么要用用CoGetClassObject

大多数情况下使用 CoCreateInstanc 创建组件,而不使用CoGetClassObject。但是在以下两种情况  下应使用CoGetClassObject而不使用 CoCreateInstanc 。
1、若想用不同于 IClassFactory 的某个创建接口来创建组件,则必须使用CoGetClassObject。
2、若需要创建同一组件的多个不同实例,使用CoGetClassObject可以取得较高效率。因为这样只需相应组件的类厂一次,而CoCreateInstanc 需要为每个实例分别创建并释放相应的类厂。
另外,CoGetClassObject可以对组件的创建过程进行更多的控制。

Posted on 2006-12-14 21:53 艾凡赫 阅读(1020) 评论(0)  编辑 收藏 引用 所属分类: COM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理