//Cmpnt1.cpp -- Component1
#include <iostream.h>
#include <objbase.h>
#include "Iface.h"
#include "Registry.h"
void trace(const char* msg){cout<<"Component1; \t "<<msg<<endl;}
static HMODULE g_hModule = NULL;
static long g_cComponents = 0;
static long g_cServerLocks = 0;
const char g_szFriendlyName[] = "Inside COM,Component1";
const char g_szProgID[] = "InsideCOM.Cmpnt1_1";
//
class CA : public IX{
public:
virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void __stdcall Fx(){cout<<"Fx"<<endl;}
virtual void __stdcall Fy(){m_pIY->Fy();}
CA();
~CA();
HRESULT __stdcall Init();
private:
long m_cRef;
IY* m_pIY;
IUnknown* m_pUnknownInner;
};
CA::CA():m_cRef(1),m_pUnknownInner(NULL){
InterlockedIncrement(&m_cComponents);
}
CA::~CA(){
InterlockedDecrement(&g_cComponents);
trace("Destroy self.");
m_cRef = 1;
IUnknown* pUnknownOuter = this;
pUnknownOuter->AddRef();
m_pIY->Release();
if(m_pUnknownInner != NULL){
m_pUnknownInner->Release();
}
HRESULT __stdcall CA::Init(){
IUnknown* pUnknownOuter = this;
trace("Create inner component.");
HRESULT hr = ::CoCreateInstance(CLSID_Component2,pUnknownOuter, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&m_pUnknownInner);
if(FAILED(hr)){
trace("Could not create contained component.");
return E_FAIL;
}
hr = m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);
if(FAILED(hr)){
trace("Inner component does not support interface IY.");
m_pUnknowInner->Release();
return E_FAIL;
}
pUnknownOuter->Release();
return S_OK;
}
HRESULT __stdcall CA::QueryInterface(const IID& iid,void** ppv){
if(iid == IID_IUnknown){
*ppv = static_cast<IUnknown*>(this);
}
else if(iid == IID_IX){
*ppv = static_cast<IX*>(this);
}
else if(iid == IID_IY){
trace("Return inner component's IY interface.");
return m_pUnknownInner->QueryInterface(iid,ppv);
//or *ppv = m_pIY;
}