windows-nt/Source/XPSP1/NT/com/ole32/dllhost/csrgt.cxx
2020-09-26 16:20:57 +08:00

181 lines
5.6 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: CSurrogate.cxx
//
// Contents: Class the implements the ISurrogate interface
//
//
// History: 21-May-96 t-AdamE Created
// 09-Apr-98 WilfR Updated for Unified Surrogate
//
//--------------------------------------------------------------------------
#include "csrgt.hxx"
#include "srgtdeb.hxx"
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::~CSurrogate()
//
// Synopsis: destructor for CSurrogate
//
// History: 4-09-98 WilfR Created
//
//----------------------------------------------------------------------------
CSurrogate::~CSurrogate()
{
if( _hEventSurrogateFree )
CloseHandle( _hEventSurrogateFree );
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::Init()
//
// Synopsis: Initializes data structures with error results
//
// History: 4-09-98 WilfR Created
//
//----------------------------------------------------------------------------
BOOL CSurrogate::Init()
{
// create the event to be signaled when we are freed
return (_hEventSurrogateFree =
CreateEvent(NULL,FALSE,FALSE,NULL)) != NULL ? TRUE : FALSE;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::QueryInterface
//
// History: 6-21-96 t-Adame Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CSurrogate::QueryInterface(REFIID iid, LPVOID FAR * ppv)
{
if (iid == IID_IUnknown)
{
*ppv = (void*)(IUnknown*)this;
AddRef();
return S_OK;
}
else if (iid == IID_ISurrogate)
{
*ppv = (void*)(ISurrogate*)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::AddRef()
//
// History: 6-21-96 t-Adame Created
//
//----------------------------------------------------------------------------
ULONG CSurrogate::AddRef()
{
InterlockedIncrement((LPLONG)&_cref);
Win4Assert(_cref > 0);
ULONG cref = _cref; // NOTE: not thread safe but not worth worrying about
return cref;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::Release()
//
// Synopsis: Decrements our Reference count -- note that this
// implementation of ISurrogate does not delete the object
// that implements it so that we can allocate it on the stack
//
// History: 6-21-96 t-Adame Created
//
//----------------------------------------------------------------------------
ULONG CSurrogate::Release()
{
Win4Assert(_cref >0);
InterlockedDecrement((LPLONG)&_cref);
ULONG cref = _cref; // NOTE: not thread safe but not worth worrying about
return cref;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::LoadDllServer
//
// Synopsis: Loads information about the dll corresponding to the specified
// clsid into our table of loaded dlls, which implicitly
// loads the dll into the surrogate process
//
// History: 6-21-96 t-Adame Created
// 4-09-98 WilfR This is never called for the Unified
// Surrogate
//
//----------------------------------------------------------------------------
STDMETHODIMP CSurrogate::LoadDllServer(
/* [in] */ REFCLSID rclsid)
{
SrgtDebugOut(DEB_SRGT_METHODCALL,"ISurrogate::LoadDllServer called\n",0);
// TODO: I should probably put an assertion in here.
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::FreeSurrogate
//
// Synopsis: called by OLE when there are no external references to clients
// of dll servers that were loaded by this object. A call
// to this function signals the surrogate process that it should
// terminate
//
// History: 6-21-96 t-Adame Created
// 4-09-98 WilfR Modified for Unified Surrogate
//
//----------------------------------------------------------------------------
STDMETHODIMP CSurrogate::FreeSurrogate()
{
SrgtDebugOut(DEB_SRGT_METHODCALL,"ISurrogate::FreeSurrogate called\n",0);
Win4Assert(_hEventSurrogateFree != NULL);
return SetEvent(_hEventSurrogateFree) ? S_OK : E_FAIL;
}
//+---------------------------------------------------------------------------
//
// Function: CSurrogate::WaitForSurrogateFree
//
// Synopsis: sleep the main thread of the surrogate process until OLE
// signals us via a call to FreeSurrogate that we should terminate.
//
// History: 6-21-96 t-Adame Created
// 4-09-98 WilfR Changed the name and implementation
// for new Unified Surrogate. (implementation
// was copied from
//
//----------------------------------------------------------------------------
void CSurrogate::WaitForSurrogateFree()
{
Win4Assert(_hEventSurrogateFree != NULL);
// wait for the FreeSurrogate method of ISurrogate to be called
// NOTE: in the previous incarnation of the surrogate we use to
// timeout every 60 seconds to call CoFreeUnusedLibraries().
// Since this was being done in the MTA and we do nothing to
// perform a similar tasks in the STAs we create its effectiveness
// is minimal.
WaitForSingleObject(_hEventSurrogateFree, INFINITE);
}