int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr; CA *pA = new CA(); //引用计数1 //从组件查询IUnknown接口 IUnknown *pIUnknown = NULL; hr = pA->QueryInterface(IID_IUnknown, (void**)&pIUnknown); //引用计数2 if (SUCCEEDED(hr)) //对HRESULT返回值的判断,一般采用SUCCEEDED { pA->Release(); //pA不再使用,引用计数1 pA = NULL; //访止再不小心使用m_pA //从IUnknown查询IX接口 IX *pIX = NULL; hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX); //引用计数2 if (SUCCEEDED(hr)) { //调用IX接口的方法 pIX->Fx1(); pIX->Fx2(); } //从IUnknown查询IY接口 IY *pIY = NULL; hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY); //引用计数3 if (SUCCEEDED(hr)) { //调用IY接口的方法 pIY->Fy1(); pIY->Fy1(); } if ((void*)pIX != (void*)pIY) { cout << "pIX != pIY" <<endl; } if ((void*)pIUnknown != (void*)pIY) { cout << "pIUnknown != pIY" <<endl; } pIY->Release(); //pIY不再使用,引用计数2 pIY = NULL; if ((void*)pIUnknown == (void*)pIX) { cout << "pIUnknown == pIX" <<endl; } //从IX查询IY IY *pIY2 = NULL; hr = pIX->QueryInterface(IID_IY, (void**)&pIY2); //引用计数,引用计数3 pIX->Release(); //pIX不再使用,引用计数2 pIX = NULL; if (SUCCEEDED(hr)) { pIY2->Fy1(); pIY2->Fy2(); } pIY2->Release(); //pIY不再使用,引用计数1 pIY2 = NULL; } //目前引用计数为1,因为pIUnknown还在使用。 IX *pIX2 = NULL; hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX2); //引用计数为2 if (SUCCEEDED(hr)) { IX *pIX3 = NULL; pIX3 = pIX2; //执行了赋值 pIX3->AddRef(); //由于上句执行了赋值,所以引用计数需要自增,引用计数为3 pIX3->Fx1(); pIX3->Fx2(); pIX3->Release(); //pIX3不再使用,引用计数为2 pIX3 = NULL; } pIX2->Release(); //pIX2不再使用,引用计数为1 pIX2 = NULL; pIUnknown->Release(); //pIUnknown不再使用,引用计数为0,Release函数里执行了delete this,销毁组件的内存资源 pIUnknown = NULL; //释放组件? no! //delete pA; //不再需要写delete代码 return 0; }
int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr; //创建组件 CA *pA = new CA(); //从组件查询IUnknown接口 IUnknown *pIUnknown = NULL; hr = pA->QueryInterface(IID_IUnknown, (void**)&pIUnknown); if (SUCCEEDED(hr)) //对HRESULT返回值的判断,一般采用SUCCEEDED { //从IUnknown查询IX接口 IX *pIX = NULL; hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX); if (SUCCEEDED(hr)) { //调用IX接口的方法 pIX->Fx1(); pIX->Fx2(); } //从IUnknown查询IY接口 IY *pIY = NULL; hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY); if (SUCCEEDED(hr)) { //调用IY接口的方法 pIY->Fy1(); pIY->Fy1(); } if ((void*)pIX != (void*)pIY) { cout << "pIX != pIY" <<endl; } if ((void*)pIUnknown != (void*)pIY) { cout << "pIUnknown != pIY" <<endl; } if ((void*)pIUnknown == (void*)pIX) { cout << "pIUnknown == pIX" <<endl; } //从IX查询IY IY *pIY2 = NULL; hr = pIX->QueryInterface(IID_IY, (void**)&pIY2); if (SUCCEEDED(hr)) { pIY2->Fy1(); pIY2->Fy2(); } //从IX也可以查询到IUnknown //从IY也可以查询到IX //从IY也可以查询到IUnknown //从CA也可以查询到IX //从CA也可以查询到IY //总结: //只要是CA所继承的接口,从CA的组件里都可以查询到; //只要是CA所继承的接口,从CA所继承的其它接口里都可以查询到。 } //释放组件 delete pA; return 0; }