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;
}