1.CoCreateInstance的不靈活.
?
? 我們知道 CoCreateInstance創(chuàng)建組件的過(guò)程是:傳給他一個(gè)CLSID,然后它創(chuàng)建相應(yīng)的組件.,并返回所請(qǐng)求接口的指針,.CoCreateInstance沒(méi)有提供一種可以控制組件創(chuàng)建過(guò)程的的方法.
?
? 存在問(wèn)題: 我們不能控制組件創(chuàng)建過(guò)程.
? 解決方案: 使用一個(gè)專門(mén)創(chuàng)建組件的組件,既 類廠.
2.類廠.
?實(shí)際上CoCreateInstance并沒(méi)有創(chuàng)建組件,而是創(chuàng)建了一個(gè)被稱為類廠的組件.
?類廠唯一功能就是創(chuàng)建其他組件.
?精確點(diǎn)講就是.某個(gè)特定類廠將創(chuàng)建某個(gè)特定CLSID相應(yīng)的組件. 客戶可以通過(guò)類廠所支持的接口來(lái)對(duì)類廠創(chuàng)建組件的過(guò)程加以控制. 創(chuàng)建組件的標(biāo)準(zhǔn)接口是 IClassFactory,用CoCreateInstance創(chuàng)建的組件實(shí)際上是通過(guò)IClassFactory來(lái)創(chuàng)建的.
3.CoGetClassObject
要?jiǎng)?chuàng)建一個(gè)組件,首先要?jiǎng)?chuàng)建類廠本身.
?? CoCreateInstance()用來(lái)創(chuàng)建與指定CLSID的組件,并返回指向組件某個(gè)接口的指針.
?? 與CoCreateInstance類似,用CoGetClassObject() 來(lái)創(chuàng)建與指定CLSID的類廠,并返回指向類廠某個(gè)接口的指針.
? 函樹(shù)定義如下:
?
? HRESULT __stdcall 用CoGetClassObject(
?? const CLSID & clsid,
?? DWORD? dwClsContext,??? //server context
?? COSERVERINFO *pServerInfo,? //Resevred for DCOM
?? const IID &iid,
?? void ** ppv
);
?客戶用 CoCreateInstanc 所返回的指針來(lái)創(chuàng)建所需的組件,這個(gè)指針通常是一個(gè)IClassFactory指針.
?
?3.IClassFactory
?
?類廠所支持的用于創(chuàng)建組件的標(biāo)準(zhǔn)接口是 IClassFactory.大部分組件可以通過(guò)它來(lái)創(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。但是在以下兩種情況??下應(yīng)使用CoGetClassObject而不使用 CoCreateInstanc 。
1、若想用不同于 IClassFactory 的某個(gè)創(chuàng)建接口來(lái)創(chuàng)建組件,則必須使用CoGetClassObject。
2、若需要?jiǎng)?chuàng)建同一組件的多個(gè)不同實(shí)例,使用CoGetClassObject可以取得較高效率。因?yàn)檫@樣只需相應(yīng)組件的類廠一次,而CoCreateInstanc 需要為每個(gè)實(shí)例分別創(chuàng)建并釋放相應(yīng)的類廠。
另外,CoGetClassObject可以對(duì)組件的創(chuàng)建過(guò)程進(jìn)行更多的控制。