#ifndef __TCMarshalByValue_h__
#define __TCMarshalByValue_h__
#include "resource.h"
#include <AGC.h>
#include <..\TCLib\ObjectLock.h>
class ATL_NO_VTABLE CTCMarshalByValue :
public IMarshal,
public CComCoClass<CTCMarshalByValue, &CLSID_TCMarshalByValue>,
public CComObjectRoot
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_TCMarshalByValue)
DECLARE_ONLY_AGGREGATABLE(CTCMarshalByValue)
public:
BEGIN_CATEGORY_MAP(CTCMarshalByValue)
IMPLEMENTED_CATEGORY(CATID_AGC)
END_CATEGORY_MAP()
public:
BEGIN_COM_MAP(CTCMarshalByValue)
COM_INTERFACE_ENTRY(IMarshal)
END_COM_MAP()
public:
CTCMarshalByValue();
#if defined(_DEBUG) && defined(CTCMarshalByValue_DEBUG)
HRESULT CTCMarshalByValue::FinalConstruct();
void CTCMarshalByValue::FinalRelease();
#endif public:
STDMETHODIMP GetUnmarshalClass(REFIID riid, void* pv, DWORD dwDestContext,
void* pvDestContext, DWORD mshlflags, CLSID* pCid);
STDMETHODIMP GetMarshalSizeMax(REFIID riid, void* pv, DWORD dwDestContext,
void* pvDestContext, DWORD mshlflags, DWORD* pSize);
STDMETHODIMP MarshalInterface(IStream* pStm, REFIID riid, void* pv,
DWORD dwDestContext, void* pvDestContext, DWORD mshlflags);
STDMETHODIMP UnmarshalInterface(IStream* pStm, REFIID riid, void** ppv);
STDMETHODIMP ReleaseMarshalData(IStream* pStm);
STDMETHODIMP DisconnectObject(DWORD dwReserved);
protected:
HRESULT GetOuterPersistStream(IPersistStream** pps);
protected:
typedef TCObjectLock<CTCMarshalByValue> CLock;
protected:
DWORD m_dwEndian;
const DWORD m_dwEndianOriginal, m_dwEndianInverted;
};
inline HRESULT CTCMarshalByValue::GetOuterPersistStream(IPersistStream** pps)
{
HRESULT hr = OuterQueryInterface(IID_IPersistStream, (void**)pps);
if (SUCCEEDED(hr))
return hr;
return OuterQueryInterface(IID_IPersistStreamInit, (void**)pps);
}
#endif