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可以對組件的創建過程進行更多的控制。