//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995 // // File: localobj.h // // Contents: Contains class definitions of objects used in the remoteable // object proxy object. // //---------------------------------------------------------------------------- class CLocalMTProxy; //+--------------------------------------------------------------------------- // // Class: CMTLocalFactory // // Purpose: Standard implementation of a class factory. This is meant // to be created as a global object and therefore does not // destroy itself when its refcount goes to zero. // //---------------------------------------------------------------------------- class CMTLocalFactory : public IClassFactory { public: CMTLocalFactory(); ~CMTLocalFactory() {}; // IUnknown methods STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); STDMETHOD_(ULONG, AddRef) (void) { return InterlockedIncrement((long*)&_ulRefs); } STDMETHOD_(ULONG, Release) (void) { if (InterlockedDecrement((long*)&_ulRefs) == 0) { return 0; } return _ulRefs; } // IClassFactory methods STDMETHOD(CreateInstance)(IUnknown *pUnkOuter, REFIID riid, void ** ppvObject); STDMETHOD(LockServer)(BOOL fLock); private: ULONG _ulRefs; }; //+--------------------------------------------------------------------------- // // Class: CMTEventSink (ces) // // Purpose: Class which sinks events from the remote object // //---------------------------------------------------------------------------- class CMTEventSink : public IDispatch { public: DECLARE_MEMCLEAR_NEW_DELETE(); CMTEventSink() { } ~CMTEventSink() { } // IUnknown methods STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); // IDispatch interface STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo); STDMETHOD(GetTypeInfo)( UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo); STDMETHOD(GetIDsOfNames)( REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid); STDMETHOD(Invoke)( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr); private: CLocalMTProxy* Proxy(); }; //+--------------------------------------------------------------------------- // // Class: CLocalMTProxy (cm) // // Purpose: Contains all useful info about a machine and what it's // doing. // // Notes: This class is manipulated from multiple threads. All // member functions must be thread safe! // // This is the class that is created by the class factory and // handed out as a remote object to other machines. It has no // real code in itself but merely provides a way to talk to the // already running script engines. // //---------------------------------------------------------------------------- class CLocalMTProxy : public IRemoteMTScriptProxy, public IConnectionPointContainer, public IProvideClassInfo { friend class CLocalProxyCP; friend class CMTEventSink; public: DECLARE_MEMCLEAR_NEW_DELETE(); CLocalMTProxy(); ~CLocalMTProxy(); // IUnknown methods. Because we have a refcounted sub-object (our event // sink) we must do more complicated object lifetime stuff here. STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); ULONG SubAddRef (void); ULONG SubRelease (void); void Passivate(void); // IDispatch interface STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo); STDMETHOD(GetTypeInfo)( UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo); STDMETHOD(GetIDsOfNames)( REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid); STDMETHOD(Invoke)( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr); // IConnectionPointContainer methods STDMETHOD(EnumConnectionPoints)(LPENUMCONNECTIONPOINTS*); STDMETHOD(FindConnectionPoint)(REFIID, LPCONNECTIONPOINT*); // IProvideClassInfo methods STDMETHOD(GetClassInfo)(ITypeInfo **pTI); // IRemoteMTScriptProxy interface STDMETHOD(Connect)(BSTR bstrMachine); STDMETHOD(Disconnect)(); STDMETHOD(DownloadFile)(BSTR bstrURL, BSTR *bstrFile); HRESULT LoadTypeLibs(); private: DWORD _ulAllRefs; DWORD _ulRefs; ITypeLib * _pTypeLibDLL; ITypeInfo * _pTypeInfoInterface; ITypeInfo * _pTypeInfoCM; IDispatch * _pDispRemote; DWORD _dwSinkCookie; CMTEventSink _cesSink; IDispatch* _pDispSink; }; inline CLocalMTProxy * CMTEventSink::Proxy() { return CONTAINING_RECORD(this, CLocalMTProxy, _cesSink); } inline STDMETHODIMP_(ULONG) CMTEventSink::AddRef(void) { return Proxy()->SubAddRef(); } inline STDMETHODIMP_(ULONG) CMTEventSink::Release(void) { return Proxy()->SubRelease(); } //+--------------------------------------------------------------------------- // // Class: CLocalProxyCP (mcp) // // Purpose: Implements IConnectionPoint for CLocalMTProxy // //---------------------------------------------------------------------------- class CLocalProxyCP : public IConnectionPoint { public: CLocalProxyCP(CLocalMTProxy *pMTP); ~CLocalProxyCP(); DECLARE_STANDARD_IUNKNOWN(CLocalProxyCP); STDMETHOD(GetConnectionInterface)(IID * pIID); STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer ** ppCPC); STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD * pdwCookie); STDMETHOD(Unadvise)(DWORD dwCookie); STDMETHOD(EnumConnections)(LPENUMCONNECTIONS * ppEnum); CLocalMTProxy *_pMTProxy; }; extern HINSTANCE g_hInstDll; extern long g_lObjectCount;