/* code: */ #include #include "com_main.h" #include "tracemsg.h" EXPORT IUnknown* CreateInstance() { TraceMsg tm("CreateInstance"); IUnknown* pIUnknown = (ITest*) new CTest; return pIUnknown; } CTest::CTest() { TraceMsg tm("CTest::CTest"); this->refCount=0; this->topSecret=0; } HRESULT __stdcall CTest::QueryInterface(const IID& iid, void** ppv) { TraceMsg tm("CTest::QueryInterface"); if (iid == IID_IUnknown) { tm.msg("Asking for IUnknown, returning pointer"); *ppv = (IUnknown*)this; } else if (iid == IID_ITest) { tm.msg("Asking for ITest, returning pointer"); *ppv = (ITest*)this; } else { tm.msg("Asking for unrecognized or unimplemented interface, returning error"); *ppv = NULL; return E_NOINTERFACE; } this->AddRef(); return S_OK; } ULONG __stdcall CTest::AddRef() { TraceMsg tm("CTest::AddRef"); tm.msg("Incrementing reference count"); this->refCount++; tm.msg("%d references existing",this->refCount); return this->refCount; } ULONG __stdcall CTest::Release() { TraceMsg tm("CTest::Release"); tm.msg("Decrementing reference count"); if(--this->refCount == 0) { tm.msg("No references left, freeing object"); delete this; return 0; } tm.msg("%d references existing",this->refCount); return this->refCount; } void __stdcall CTest::SetNumber(long number) { TraceMsg tm("CTest::SetNumber"); tm.msg("Number changed from %d to %d",this->topSecret, number); this->topSecret = number; } long __stdcall CTest::GetNumber() { TraceMsg tm("CTest::GetNumber"); tm.msg("Retrieving number (%d)",this->topSecret); return this->topSecret; } /* output: CreateInstance { CTest::CTest { } } CTest::QueryInterface { msg: Asking for ITest, returning pointer CTest::AddRef { msg: Incrementing reference count msg: 1 references existing } } CTest::SetNumber { msg: Number changed from 0 to 42 } CTest::GetNumber { msg: Retrieving number (42) } CTest::Release { msg: Decrementing reference count msg: No references left, freeing object } */