// TelClass.cpp: implementation of the CTribbleClass class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "TribbleInterface.h" #include "Tribble.h" #include "TribbleClass.h" /// externs extern CString ResolveIIDName(REFIID riid); /// Our GLOBAL class object CTribbleClass g_TribbleClass; // The real IUnknown Implementation HRESULT CTribbleClass::QueryInterface(REFIID lID, void * * pvItf) { HRESULT hr = S_OK; CString strInterface = ResolveIIDName(lID); CString strOut; if(lID == IID_IUnknown) *pvItf = static_cast (this); else if (IID_IClassFactory == lID) *pvItf = static_cast (this); else { // we've been asked for something we don't support // so find out what it is strOut.Format("CTribbleClass::QueryInterface() - Unsupported IID: %s\n",strInterface); OutputDebugString(strOut); AfxMessageBox(strOut,MB_OK); hr = E_NOINTERFACE; *pvItf = 0; } // note the double check here!!! if (*pvItf) { ((IUnknown *) (*pvItf))->AddRef (); strOut.Format("CTribbleClass::QueryInterface() - IID: %s\n",strInterface); OutputDebugString(strOut); } return(hr); } ULONG CTribbleClass::AddRef() { OutputDebugString("CTribbleClass AddRef()\n"); LockModule(); return(0L); } ULONG CTribbleClass::Release() { OutputDebugString("CTribbleClass Release()\n"); UnlockModule(); return(0L); } ////////////////////////////////////////////////////////////////// // IClassFactory Implementation HRESULT CTribbleClass::CreateInstance(IUnknown * pUnkOuter, REFIID riid, void * * ppvObject) { HRESULT hr = S_OK; OutputDebugString("CTribbleClass::CreateInstance\n"); // If we don't support aggregation then return this error if(pUnkOuter) hr = CLASS_E_NOAGGREGATION; else { Tribble *pTribble; pTribble = new Tribble; if (!pTribble) hr = E_OUTOFMEMORY; else { pTribble->AddRef (); hr = pTribble->QueryInterface (riid,ppvObject); pTribble->Release (); } } return hr; } HRESULT CTribbleClass::LockServer(BOOL fLock) { if(fLock) LockModule(); else UnlockModule(); return(S_OK); }