#ifndef __IAGCCommonImpl_h__ #define __IAGCCommonImpl_h__ /*------------------------------------------------------------------------- * AGC\AGCCommon.h * * CAGCCommon is inherited by all AGC Objects (except low-level ones like * AGCVector). * * Note that AGCBase is inherited by most AGC objects (except low-level ones, * AGC Collections, and AGCGame). * * Owner: * * Copyright 1986-2000 Microsoft Corporation, All Rights Reserved *-----------------------------------------------------------------------*/ #include ///////////////////////////////////////////////////////////////////////////// // Conversion Function Templates template inline AGCIGC* Host2Igc(HOSTIGC* p) { return p; } template inline HOSTIGC* Igc2Host(AGCIGC* p) { return p; } ///////////////////////////////////////////////////////////////////////////// // Interface Map Macro // // Classes derived from IAGCCommonImpl should include this macro in their // interface maps. // #define COM_INTERFACE_ENTRIES_IAGCCommonImpl() \ COM_INTERFACE_ENTRY(IAGCCommon) \ COM_INTERFACE_ENTRY(IAGCPrivate) ///////////////////////////////////////////////////////////////////////////// // Type Declaration Macro // #define DECLARE_AGC_TYPE(type) \ LPCOLESTR GetType() \ { \ return OLESTR(#type); \ } ///////////////////////////////////////////////////////////////////////////// // template class ATL_NO_VTABLE IAGCCommonImpl : public IDispatchImpl, public IAGCPrivate, public CComObjectRootEx { // Declarations public: DECLARE_AGC_TYPE(agc) // Types public: typedef IAGCCommonImpl IAGCCommonImplBase; // Construction / Destruction public: IAGCCommonImpl() : m_pIGC(NULL) { } virtual ~IAGCCommonImpl() { GetAGCGlobal()->RemoveAGCObject(m_pIGC, false); } void Init(AGCIGC* pIGC) { // Save the specified Igc pointer m_pIGC = pIGC; } // Attributes public: AGCIGC* GetIGC() { return m_pIGC; } IGC* GetHostIGC() { return Igc2Host(m_pIGC); } // Implementation public: static void WINAPI ObjectMain(bool bStarting) { if (bStarting) { // Register our creator function for the AGCITF's IID IAGCGlobalPtr sp(GetAGCGlobal()); sp->RegisterObjectCreator(__uuidof(AGCITF), T::CreateAGCObject); // Register the same creator function for the IGC's IID, if different if (__uuidof(ITF) != __uuidof(AGCITF)) sp->RegisterObjectCreator(__uuidof(ITF), T::CreateAGCObject); } } static HRESULT WINAPI CreateAGCObject(void* pIgc, REFIID riid, void** ppUnk) { CComObject* pObj = NULL; RETURN_FAILED(pObj->CreateInstance(&pObj)); pObj->Init(reinterpret_cast(pIgc)); HRESULT hr = pObj->QueryInterface(riid, ppUnk); if (FAILED(hr)) delete pObj; return hr; } // IAGCCommon Interface Methods public: /////////////////////////////////////////////////////////////////////////// // Name: get_UniqueID // // Description: Gets this object's unique AGC id number ID. // // Remarks: We need to be able to generate a unique ID for all AGC objects. // IGC creates unique ID's for most IbaseIGC objects. Unfortunately, many // IGC objects do not derive from IbaseIGC, like ImissionIGC and all the // collections. // // Note: This is overrided in IAGCBaseImpl. This version of get_UniqueID() // is for AGC objects that represent IGC objects not derived from // IbaseIgc (such as ImissionIgc and all of the IGC collections). // /* STDMETHODIMP get_UniqueID(AGCUniqueID* pObjectID) { debugf("IAGCCommonImpl::get_UniqueID:()\n"); assert(GetIGC()); CLEAROUT(pObjectID, (AGCUniqueID)GetIGC()); // return IGC ptr for now, TODO: make better return S_OK; } */ STDMETHODIMP get_Type(BSTR* pbstrType) { // Get a pointer to the most-derived type T* pT = static_cast(this); // Get the object's type string CComBSTR bstrType(pT->GetType()); // Detach the string to the [out] parameter CLEAROUT(pbstrType, (BSTR)bstrType); bstrType.Detach(); // Indicate success return S_OK; } // IAGCPrivate Interface Methods public: STDMETHODIMP_(void*) GetIGCVoid() { const void* p = m_pIGC; return const_cast(p); } // Data Members protected: AGCIGC* m_pIGC; }; ///////////////////////////////////////////////////////////////////////////// #endif // !__IAGCCommonImpl_h__