int main() { CA * pa1 = new
CA(1.5); CA * pa2 = new
CA(2.75);
} 上述对象将共享同一 vtbl(虚表指针,), 指向同一虚函数表
![]()
如CreateDevice()返回接口指针,这些接口及其占用内存什么时候释放,要通过“引用计数”的技术来解决。AddRef()给这个接口指针的计数加1,而Release()会将之减1.一旦减到0,表示没有客户使用了,相关的接口就释放了。 由此可知,每次调用Rlease()后,并不一定会释放内存,而是当引用计数归0时释放内存
com 更类似于在某次社交聚会上同某人会面,而与对他们进行工作面试有很大的不同,当进行工作面试时,被试者将提交一份介绍他们情况的个人简历,这份 个人简历类似于c++ 类的定义,而当在社交聚会上会面时,没有人会给对方提供个人简历。为了了解对方的情况,必须向它们提问,着一点是类似于com 组件的。
第四章 引用计数
com 更类似于在某次社交聚会上同某人会面,而与对他们进行工作面试有很大的不同,当进行工作面试时,被试者将提交一份介绍他们情况的个人简历,这份 个人简历类似于c++ 类的定义,而当在社交聚会上会面时,没有人会给对方提供个人简历。为了了解对方的情况,必须向它们提问,着一点是类似于com 组件的。 第四章 引用计数 CoCreateInstace 某个特定的类厂将创建只同某个特定的CLSID相应的组件 CoCreateInstance 创建的组件实际上是通过IClassFactory来创建的 CoGetClassObject( CLSID & clsid, DWORD ; CONSERVERINFO* const IID, void **ppv; ) 这两个 最大的区别是 : CoGetClassObject 返回的是 指向所需组件的类厂而不是指向组件本身的一个指针,客户可以通过用CoGetClassObject所返回的指针来创建所需的组件, 这个指针通常是一个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; }
|
|
来自: 水中麒麟 > 《com(组建对象)》