// // COMCalc.cpp // #include <iostream.h> #include <objbase.h> #include "Iserver.h" // Interface declarations #include "Registry.h" // Registry helper functions /////////////////////////////////////////////////////////// // // Global variables // static HMODULE g_hModule = NULL ; // DLL module handle static long g_cComponents = 0 ; // Count of active components static long g_cServerLocks = 0 ; // Count of locks // Friendly name of component const char g_szFriendlyName[] = "COMCalc Server" ; // Version-independent ProgID const char g_szVerIndProgID[] = "Example.COMCalc" ; // ProgID const char g_szProgID[] = "Example.COMCalc.1" ; // // Interface GUID definitions -- same as in client.cpp // Not shown here // ... // // Component // class CA : public IAddSub, public IMulDiv { public: // IUnknown virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv); virtual ULONG __stdcall AddRef() ; virtual ULONG __stdcall Release() ; // Interface IaddSub virtual int __stdcall Add(int x,int y) { IAddSub_last_result=x+y; return IAddSub_last_result; } virtual int __stdcall Subtract(int x,int y) { IAddSub_last_result=x-y; return IAddSub_last_result; } // Interface ImulDiv virtual int __stdcall Multiply(int x,int y) { IMulDiv_last_result=x*y; return IMulDiv_last_result; } virtual int __stdcall Divide(int x,int y) { IMulDiv_last_result=x/y; return IMulDiv_last_result; } // Constructor CA() ; // Destructor ~CA() ; private: // Reference count long m_cRef ; } ; // // Not shown: CA constructor and destructor // ... // // // IUnknown implementation // HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv) { if (iid == IID_IUnknown) { *ppv = static_cast<IAddSub*>(this) ; } else if (iid == IID_IAddSub) { *ppv = static_cast<IAddSub*>(this) ; cout<<"COMCalc:\t\tReturn pointer to IAddSub.\n" ; } else if (iid == IID_IMulDiv) { *ppv = static_cast<IMulDiv*>(this) ; cout<<"COMCalc:\t\tReturn pointer to IMulDiv.\n" ; } else { *ppv = NULL ; return E_NOINTERFACE ; } reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; return S_OK ; } // // Not shown: CA::AddRef() and CA::Release(), // ... // //End of File