1.CoCreateInstance的不靈活.
?
? 我們知道 CoCreateInstance創(chuàng)建組件的過程是:傳給他一個CLSID,然后它創(chuàng)建相應的組件.,并返回所請求接口的指針,.CoCreateInstance沒有提供一種可以控制組件創(chuàng)建過程的的方法.
?
? 存在問題: 我們不能控制組件創(chuàng)建過程.
? 解決方案: 使用一個專門創(chuàng)建組件的組件,既 類廠.
2.類廠.
?實際上CoCreateInstance并沒有創(chuàng)建組件,而是創(chuàng)建了一個被稱為類廠的組件.
?類廠唯一功能就是創(chuàng)建其他組件.
?精確點講就是.某個特定類廠將創(chuàng)建某個特定CLSID相應的組件. 客戶可以通過類廠所支持的接口來對類廠創(chuàng)建組件的過程加以控制. 創(chuàng)建組件的標準接口是 IClassFactory,用CoCreateInstance創(chuàng)建的組件實際上是通過IClassFactory來創(chuàng)建的.
3.CoGetClassObject
要創(chuàng)建一個組件,首先要創(chuàng)建類廠本身.
?? CoCreateInstance()用來創(chuàng)建與指定CLSID的組件,并返回指向組件某個接口的指針.
?? 與CoCreateInstance類似,用CoGetClassObject() 來創(chuàng)建與指定CLSID的類廠,并返回指向類廠某個接口的指針.
? 函樹定義如下:
?
? HRESULT __stdcall 用CoGetClassObject(
?? const CLSID & clsid,
?? DWORD? dwClsContext,??? //server context
?? COSERVERINFO *pServerInfo,? //Resevred for DCOM
?? const IID &iid,
?? void ** ppv
);
?客戶用 CoCreateInstanc 所返回的指針來創(chuàng)建所需的組件,這個指針通常是一個IClassFactory指針.
?
?3.IClassFactory
?
?類廠所支持的用于創(chuàng)建組件的標準接口是 IClassFactory.大部分組件可以通過它來創(chuàng)建.
?聲明如下:
??
?interface?IClassFactory :IUnknown
?{
??HRESULT stdcall ?CreateInstace(IUnknown * pUnknownOuter,
??????????????????const IID &iid,
??????????????????void **ppv);
??HRESULT stdcall LockServer(bool bLock);
??};
??
?4.為什么要用用CoGetClassObject
大多數(shù)情況下使用 CoCreateInstanc 創(chuàng)建組件,而不使用CoGetClassObject。但是在以下兩種情況??下應使用CoGetClassObject而不使用 CoCreateInstanc 。
1、若想用不同于 IClassFactory 的某個創(chuàng)建接口來創(chuàng)建組件,則必須使用CoGetClassObject。
2、若需要創(chuàng)建同一組件的多個不同實例,使用CoGetClassObject可以取得較高效率。因為這樣只需相應組件的類廠一次,而CoCreateInstanc 需要為每個實例分別創(chuàng)建并釋放相應的類廠。
另外,CoGetClassObject可以對組件的創(chuàng)建過程進行更多的控制。