//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995 // // File: machine.h // // Contents: IConnectedMachine class definition // //---------------------------------------------------------------------------- //**************************************************************************** // // Forward declarations // //**************************************************************************** class CMTScript; class CScriptHost; //**************************************************************************** // // Classes // //**************************************************************************** //+--------------------------------------------------------------------------- // // Class: CMachine (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 CMachine : public CThreadComm, public IConnectedMachine, public IConnectionPointContainer { friend class CMachConnectPoint; public: DECLARE_MEMCLEAR_NEW_DELETE(); CMachine(CMTScript *pMT, ITypeInfo *pTIMachine); ~CMachine(); DECLARE_STANDARD_IUNKNOWN(CMachine); // 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*); // IConnectedMachine interface STDMETHOD(Exec)(BSTR bstrCmd, BSTR bstrParams, VARIANT *pvData); STDMETHOD(get_PublicData)(VARIANT *pvData); STDMETHOD(get_Name)(BSTR *pbstrName); STDMETHOD(get_Platform)(BSTR *pbstrPlat); STDMETHOD(get_OS)(BSTR *pbstrOS); STDMETHOD(get_MajorVer)(long *plMajorVer); STDMETHOD(get_MinorVer)(long *plMinorVer); STDMETHOD(get_BuildNum)(long *plBuildNum); STDMETHOD(get_PlatformIsNT)(VARIANT_BOOL *pfIsNT); STDMETHOD(get_ServicePack)(BSTR *pbstrSP); STDMETHOD(get_HostMajorVer)(long *plMajorVer); STDMETHOD(get_HostMinorVer)(long *plMajorVer); STDMETHOD(get_StatusValue)(long nIndex, long *pnStatus); HRESULT FireScriptNotify(BSTR bstrIdent, VARIANT vInfoF); #define LOCK_MACH_LOCALS(pObj) CMachLock local_lock(pObj); protected: virtual BOOL Init(); virtual DWORD ThreadMain(); BOOL HandleThreadMessage(); private: class CMachLock { public: CMachLock(CMachine *pThis); ~CMachLock(); private: CMachine *_pThis; }; friend class CMachLock; CMTScript * _pMT; ITypeInfo * _pTypeInfoIMachine; CRITICAL_SECTION _cs; CStackPtrAry _aryDispSink; }; inline CMachine::CMachLock::CMachLock(CMachine *pThis) : _pThis(pThis) { EnterCriticalSection(&_pThis->_cs); } inline CMachine::CMachLock::~CMachLock() { LeaveCriticalSection(&_pThis->_cs); } //+--------------------------------------------------------------------------- // // Class: CMachConnectPoint (mcp) // // Purpose: Implements IConnectionPoint for CMachine // //---------------------------------------------------------------------------- class CMachConnectPoint : public IConnectionPoint { public: CMachConnectPoint(CMachine *pMach); ~CMachConnectPoint(); DECLARE_STANDARD_IUNKNOWN(CMachConnectPoint); STDMETHOD(GetConnectionInterface)(IID * pIID); STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer ** ppCPC); STDMETHOD(Advise)(LPUNKNOWN pUnkSink, DWORD * pdwCookie); STDMETHOD(Unadvise)(DWORD dwCookie); STDMETHOD(EnumConnections)(LPENUMCONNECTIONS * ppEnum); CMachine *_pMachine; };