int main()
{
CA * pa1 = newCA(1.5);
CA * pa2 = newCA(2.75);
}
上述對象將共享同一 vtbl(虛表指針,), 指向同一虛函數(shù)表
如CreateDevice()返回接口指針,這些接口及其占用內(nèi)存什么時(shí)候釋放,要通過“引用計(jì)數(shù)”的技術(shù)來解決。AddRef()給這個(gè)接口指針的計(jì)數(shù)加1,而Release()會將之減1.一旦減到0,表示沒有客戶使用了,相關(guān)的接口就釋放了。 由此可知,每次調(diào)用Rlease()后,并不一定會釋放內(nèi)存,而是當(dāng)引用計(jì)數(shù)歸0時(shí)釋放內(nèi)存
com 更類似于在某次社交聚會上同某人會面,而與對他們進(jìn)行工作面試有很大的不同,當(dāng)進(jìn)行工作面試時(shí),被試者將提交一份介紹他們情況的個(gè)人簡歷,這份
個(gè)人簡歷類似于c++ 類的定義,而當(dāng)在社交聚會上會面時(shí),沒有人會給對方提供個(gè)人簡歷。為了了解對方的情況,必須向它們提問,著一點(diǎn)是類似于com 組件的。
第四章 引用計(jì)數(shù)
com 更類似于在某次社交聚會上同某人會面,而與對他們進(jìn)行工作面試有很大的不同,當(dāng)進(jìn)行工作面試時(shí),被試者將提交一份介紹他們情況的個(gè)人簡歷,這份
個(gè)人簡歷類似于c++ 類的定義,而當(dāng)在社交聚會上會面時(shí),沒有人會給對方提供個(gè)人簡歷。為了了解對方的情況,必須向它們提問,著一點(diǎn)是類似于com 組件的。
第四章 引用計(jì)數(shù)
CoCreateInstace 某個(gè)特定的類廠將創(chuàng)建只同某個(gè)特定的CLSID相應(yīng)的組件
CoCreateInstance 創(chuàng)建的組件實(shí)際上是通過IClassFactory來創(chuàng)建的
CoGetClassObject(
CLSID & clsid,
DWORD ;
CONSERVERINFO*
const IID,
void **ppv;
)
這兩個(gè) 最大的區(qū)別是 :
CoGetClassObject 返回的是 指向所需組件的類廠而不是指向組件本身的一個(gè)指針,客戶可以通過用CoGetClassObject所返回的指針來創(chuàng)建所需的組件,
這個(gè)指針通常是一個(gè)IClassFactory 指針
HRESULT CoCreateInstance(CLSID &clsid,IUnKnwn *pUnkOuter,DWORD dwClsContext,IID &iid,void ** ppv)
{
*ppv=NULL;
IClassFactory *pIFactory=NULL;
HRESULT hr =::CoGetClassObject(clsid,dwClsContext,NULL,IID_IClassFactory,(void **)&pIFactory);
if(SUCCEEDED(hr))
{
hr=pIFactory->QueryInterface(iid,ppv);
pIFactory->Release();
}
return hr;
}