windows-nt/Source/XPSP1/NT/sdktools/mtscript/inc/machine.h
2020-09-26 16:20:57 +08:00

176 lines
4.6 KiB
C++

//+---------------------------------------------------------------------------
//
// 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<IDispatch*, 5> _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;
};