windows-nt/Source/XPSP1/NT/com/oleutest/cmarshal/app/cmarshal.cxx
2020-09-26 16:20:57 +08:00

318 lines
7.3 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+-------------------------------------------------------------------
//
// File: cmarshal.cxx
//
// Contents: This file contins the DLL entry points
// LibMain
// DllGetClassObject (Bindings key func)
// CBasicBndCF (class factory)
// CBasicBnd (actual class implementation)
//
// Classes: CBasicBndCF, CBasicBnd
//
//
// History: 30-Nov-92 SarahJ Created
//
//---------------------------------------------------------------------
#include <windows.h>
#include <ole2.h>
#include "app.hxx"
/***************************************************************************/
STDMETHODIMP_(ULONG) CCMarshal::AddRef( THIS )
{
InterlockedIncrement( (long *) &ref_count );
return ref_count;
}
/***************************************************************************/
CCMarshal::CCMarshal()
{
ref_count = 1;
}
/***************************************************************************/
CCMarshal::~CCMarshal()
{
}
/***************************************************************************/
STDMETHODIMP CCMarshal::sick( ULONG val )
{
return proxy->sick( val );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::die_cpp( ULONG val )
{
return proxy->die_cpp( val );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::die_nt( ULONG val )
{
return proxy->die_nt( val );
}
/***************************************************************************/
STDMETHODIMP_(DWORD) CCMarshal::die( ITest *callback, ULONG catch_depth,
ULONG throw_depth, ULONG throw_val )
{
return proxy->die( callback, catch_depth, throw_depth, throw_val );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::interrupt( ITest *param, BOOL go )
{
return proxy->interrupt( param, go );
}
/***************************************************************************/
STDMETHODIMP_(BOOL) CCMarshal::hello()
{
return proxy->hello();
}
/***************************************************************************/
STDMETHODIMP CCMarshal::recurse( ITest *callback, ULONG depth )
{
return proxy->recurse( callback, depth );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::recurse_interrupt( ITest *callback, ULONG depth )
{
return proxy->recurse_interrupt( callback, depth );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::sleep( ULONG time )
{
return proxy->sleep( time );
}
/***************************************************************************/
STDMETHODIMP_(DWORD) CCMarshal::DoTest( ITest *test, ITest *another )
{
return proxy->DoTest( test, another );
}
/***************************************************************************/
STDMETHODIMP CCMarshal::QueryInterface( THIS_ REFIID riid, LPVOID FAR* ppvObj)
{
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITest))
{
*ppvObj = (ITest *) this;
AddRef();
return S_OK;
}
else
{
*ppvObj = NULL;
return E_NOINTERFACE;
}
}
/***************************************************************************/
STDMETHODIMP_(ULONG) CCMarshal::Release( THIS )
{
if (InterlockedDecrement( (long*) &ref_count ) == 0)
{
delete this;
return 0;
}
else
return ref_count;
}
/***************************************************************************/
STDMETHODIMP_(ULONG) CCMarshalCF::AddRef( THIS )
{
InterlockedIncrement( (long *) &ref_count );
return ref_count;
}
/***************************************************************************/
CCMarshalCF::CCMarshalCF()
{
ref_count = 1;
}
/***************************************************************************/
CCMarshalCF::~CCMarshalCF()
{
}
/***************************************************************************/
STDMETHODIMP CCMarshalCF::CreateInstance(
IUnknown FAR* pUnkOuter,
REFIID iidInterface,
void FAR* FAR* ppv)
{
*ppv = NULL;
if (pUnkOuter != NULL)
{
return E_FAIL;
}
if (!IsEqualIID( iidInterface, IID_ITest ))
return E_NOINTERFACE;
CCMarshal *Test = new FAR CCMarshal();
if (Test == NULL)
{
return E_OUTOFMEMORY;
}
*ppv = Test;
return S_OK;
}
/***************************************************************************/
STDMETHODIMP CCMarshalCF::LockServer(BOOL fLock)
{
return E_FAIL;
}
/***************************************************************************/
STDMETHODIMP CCMarshalCF::QueryInterface( THIS_ REFIID riid, LPVOID FAR* ppvObj)
{
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IClassFactory))
{
*ppvObj = (IUnknown *) this;
AddRef();
return S_OK;
}
*ppvObj = NULL;
return E_NOINTERFACE;
}
/***************************************************************************/
STDMETHODIMP_(ULONG) CCMarshalCF::Release( THIS )
{
if (InterlockedDecrement( (long*) &ref_count ) == 0)
{
delete this;
return 0;
}
else
return ref_count;
}
CMarshalBase::CMarshalBase()
{
proxy = NULL;
marshaller = NULL;
}
CMarshalBase::~CMarshalBase()
{
if (proxy != NULL)
{
proxy->Release();
proxy = NULL;
}
if (marshaller != NULL)
{
marshaller->Release();
marshaller = NULL;
}
}
// Returns the clsid of the object that created this CMarshalBase.
//
STDMETHODIMP CMarshalBase::GetUnmarshalClass(REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, CLSID * pCid)
{
*pCid = CLSID_ITest;
return S_OK;
}
STDMETHODIMP CMarshalBase::GetMarshalSizeMax(REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, DWORD * pSize)
{
SCODE result;
if (marshaller == NULL)
{
result = CoGetStandardMarshal( riid, this, dwDestContext, pvDestContext,
mshlflags, &marshaller );
if (FAILED(result))
return result;
}
return marshaller->GetMarshalSizeMax( riid, this, dwDestContext,
pvDestContext, mshlflags, pSize );
}
STDMETHODIMP CMarshalBase::MarshalInterface(IStream * pStm,
REFIID riid, void * pv,
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags)
{
SCODE result;
if (marshaller == NULL)
return E_FAIL;
result = marshaller->MarshalInterface( pStm, riid, this, dwDestContext,
pvDestContext, mshlflags );
if (SUCCEEDED(result))
{
proxy = (ITest *) pv;
((IUnknown *) pv)->AddRef();
}
return result;
}
STDMETHODIMP CMarshalBase::UnmarshalInterface(IStream * pStm,
REFIID riid, void * * ppv)
{
SCODE result;
if (marshaller == NULL)
{
result = CoGetStandardMarshal( riid, this, 0, NULL,
MSHLFLAGS_NORMAL, &marshaller );
if (FAILED(result))
return result;
}
result = marshaller->UnmarshalInterface( pStm, riid, (void **) &proxy );
if (SUCCEEDED(result))
{
*ppv = this;
AddRef();
}
else
*ppv = NULL;
return result;
}
STDMETHODIMP CMarshalBase::ReleaseMarshalData(IStream * pStm)
{
return marshaller->ReleaseMarshalData( pStm );
}
STDMETHODIMP CMarshalBase::DisconnectObject(DWORD dwReserved)
{
return marshaller->DisconnectObject( dwReserved );
}