241 lines
7.8 KiB
C++
241 lines
7.8 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: stdrpc.hxx
|
|
//
|
|
// Contents: Private header file for building interface proxies and stubs.
|
|
//
|
|
// Classes: CStdPSFactoryBuffer
|
|
// CStubBase
|
|
// CProxyBase
|
|
// CStdProxyBuffer
|
|
// CStreamOnMessage
|
|
//
|
|
// Functions: RpcInitMessage
|
|
// RpcGetBuffer
|
|
// RpcSendReceive
|
|
// RpcFreeBuffer
|
|
// RpcGetMarshalSizeMax
|
|
// RpcMarshalInterface
|
|
// RpcUnmarshalInterface
|
|
// RpcClientErrorHandler
|
|
// RpcServerErrorHandler
|
|
//
|
|
// History: 4-Jul-93 ShannonC Created
|
|
// 3-Aug-93 ShannonC Changes for NT511 and IDispatch support.
|
|
// 20-Oct-93 ShannonC Changed to new IRpcChannelBuffer interface.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
#ifndef __STDRPC_HXX__
|
|
#define __STDRPC_HXX__
|
|
|
|
#define _OLE2ANAC_H_
|
|
#include <stdclass.hxx>
|
|
#include "rpcferr.h"
|
|
|
|
#pragma warning(4:4355)
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CStdPSFactoryBuffer
|
|
//
|
|
// Synopsis: Standard implementation of a proxy/stub factory. Proxy/stub factory
|
|
// implementations should inherit this class and implement the
|
|
// method.
|
|
//
|
|
// Derivation: IPSFactoryBuffer
|
|
//
|
|
// Notes: By deriving a class from this base class, you automatically
|
|
// acquire implementations of DllGetClassObject and DllCanUnloadNow.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CStdPSFactoryBuffer : public IPSFactoryBuffer, public CStdFactory
|
|
{
|
|
public:
|
|
|
|
CStdPSFactoryBuffer(REFCLSID rcls);
|
|
|
|
//
|
|
// IUnknown methods
|
|
//
|
|
|
|
STDMETHOD(QueryInterface) ( REFIID riid, void** ppv );
|
|
STDMETHOD_(ULONG,AddRef) ( void );
|
|
STDMETHOD_(ULONG,Release) ( void );
|
|
|
|
//
|
|
// IPSFactoryBuffer methods must be provided in subclass.
|
|
//
|
|
|
|
};
|
|
|
|
#pragma warning(default:4355)
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CStubIUnknown
|
|
//
|
|
// Synopsis: Standard implementation of an RpcStubBuffer
|
|
//
|
|
// Derivation: IRpcStubBuffer
|
|
//
|
|
// Notes: The constructor calls DllAddRef, and the destructor calls
|
|
// DllRelease. This updates the DLL reference count used by
|
|
// DllCanUnloadNow.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CStubIUnknown : public IRpcStubBuffer
|
|
{
|
|
public:
|
|
CStubIUnknown(REFIID riid);
|
|
~CStubIUnknown();
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv);
|
|
virtual ULONG STDMETHODCALLTYPE AddRef();
|
|
virtual ULONG STDMETHODCALLTYPE Release();
|
|
virtual HRESULT STDMETHODCALLTYPE Connect(IUnknown *punkServer);
|
|
virtual void STDMETHODCALLTYPE Disconnect(void);
|
|
virtual IRpcStubBuffer *STDMETHODCALLTYPE IsIIDSupported(REFIID riid);
|
|
virtual ULONG STDMETHODCALLTYPE CountRefs(void);
|
|
virtual HRESULT STDMETHODCALLTYPE DebugServerQueryInterface(void **ppv);
|
|
virtual void STDMETHODCALLTYPE DebugServerRelease(void *pv);
|
|
|
|
void *_pInterface;
|
|
IID _iid;
|
|
|
|
private:
|
|
ULONG _cRefs;
|
|
IUnknown *_punk;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CProxyIUnknown.
|
|
//
|
|
// Synopsis: Base class for interface proxy.
|
|
//
|
|
// Notes: The interface proxy is used by a CStdProxyBuffer.
|
|
// We store the _iid so we can support dispinterfaces.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CProxyIUnknown
|
|
{
|
|
public:
|
|
CProxyIUnknown(IUnknown *punkOuter, REFIID riid);
|
|
~CProxyIUnknown();
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface
|
|
(
|
|
REFIID riid,
|
|
void **ppvObject
|
|
);
|
|
|
|
virtual ULONG STDMETHODCALLTYPE AddRef
|
|
(
|
|
void
|
|
);
|
|
|
|
virtual ULONG STDMETHODCALLTYPE Release
|
|
(
|
|
void
|
|
);
|
|
|
|
IUnknown *_punkOuter;
|
|
IID _iid;
|
|
IRpcChannelBuffer *_pRpcChannel;
|
|
CProxyIUnknown *_pNext;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CStdProxyBuffer
|
|
//
|
|
// Synopsis: Standard implementation of an RpcProxyBuffer.
|
|
//
|
|
// Derivation: IRpcProxyBuffer
|
|
//
|
|
// Notes: The constructor calls DllAddRef, and the destructor calls
|
|
// DllRelease. This updates the DLL reference count used by
|
|
// DllCanUnloadNow.
|
|
//
|
|
// The _pProxy data member points to an interface proxy.
|
|
// The interface proxy provides the public interface seen by the
|
|
// client application.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CStdProxyBuffer : public IRpcProxyBuffer
|
|
{
|
|
public:
|
|
CStdProxyBuffer(CProxyIUnknown *pProxy);
|
|
~CStdProxyBuffer();
|
|
virtual ULONG STDMETHODCALLTYPE AddRef();
|
|
virtual ULONG STDMETHODCALLTYPE Release();
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv);
|
|
virtual HRESULT STDMETHODCALLTYPE Connect(IRpcChannelBuffer *pChannel);
|
|
virtual void STDMETHODCALLTYPE Disconnect();
|
|
|
|
private:
|
|
ULONG _cRefs;
|
|
CProxyIUnknown *_pProxy;
|
|
};
|
|
|
|
typedef struct tagMIDLMESSAGE : tagRPCOLEMESSAGE
|
|
{
|
|
IRpcChannelBuffer *pRpcChannel;
|
|
void *packet;
|
|
DWORD dwExceptionCode;
|
|
} MIDLMESSAGE;
|
|
|
|
void STDAPICALLTYPE RpcInitMessage(MIDLMESSAGE *pMessage, IRpcChannelBuffer *pRpcChannel);
|
|
void STDAPICALLTYPE RpcGetBuffer(MIDLMESSAGE *pMessage, REFIID riid);
|
|
void STDAPICALLTYPE RpcSendReceive(MIDLMESSAGE *pMessage);
|
|
void STDAPICALLTYPE RpcFreeBuffer(MIDLMESSAGE *pMessage);
|
|
void STDAPICALLTYPE RpcGetMarshalSizeMax(RPC_MESSAGE *pMessage, REFIID riid, IUnknown *punk);
|
|
void STDAPICALLTYPE RpcMarshalInterface(RPC_MESSAGE *pMessage, REFIID riid, void *pv);
|
|
void STDAPICALLTYPE RpcUnmarshalInterface(RPC_MESSAGE *pMessage, REFIID riid, void **ppv);
|
|
void STDAPICALLTYPE RpcClientErrorHandler(MIDLMESSAGE *pMessage, DWORD dwException, HRESULT *phResult, error_status_t *pCommStatus, error_status_t *pFaultStatus);
|
|
void STDAPICALLTYPE RpcCheckHRESULT(HRESULT hr);
|
|
HRESULT STDAPICALLTYPE RpcServerErrorHandler(MIDLMESSAGE *pMessage, DWORD dwException);
|
|
|
|
class CStreamOnMessage : public IStream
|
|
{
|
|
|
|
public:
|
|
STDMETHOD (QueryInterface) ( THIS_ REFIID riid, LPVOID FAR* ppvObj);
|
|
STDMETHOD_(ULONG,AddRef) ( THIS );
|
|
STDMETHOD_(ULONG,Release) ( THIS );
|
|
STDMETHOD (Read) (THIS_ VOID HUGEP *pv,
|
|
ULONG cb, ULONG *pcbRead) ;
|
|
STDMETHOD (Write) (THIS_ VOID const HUGEP *pv,
|
|
ULONG cb,
|
|
ULONG *pcbWritten) ;
|
|
STDMETHOD (Seek) (THIS_ LARGE_INTEGER dlibMove,
|
|
DWORD dwOrigin,
|
|
ULARGE_INTEGER *plibNewPosition) ;
|
|
STDMETHOD (SetSize) (THIS_ ULARGE_INTEGER libNewSize) ;
|
|
STDMETHOD (CopyTo) (THIS_ IStream *pstm,
|
|
ULARGE_INTEGER cb,
|
|
ULARGE_INTEGER *pcbRead,
|
|
ULARGE_INTEGER *pcbWritten) ;
|
|
STDMETHOD (Commit) (THIS_ DWORD grfCommitFlags) ;
|
|
STDMETHOD (Revert) (THIS) ;
|
|
STDMETHOD (LockRegion) (THIS_ ULARGE_INTEGER libOffset,
|
|
ULARGE_INTEGER cb,
|
|
DWORD dwLockType) ;
|
|
STDMETHOD (UnlockRegion) (THIS_ ULARGE_INTEGER libOffset,
|
|
ULARGE_INTEGER cb,
|
|
DWORD dwLockType) ;
|
|
STDMETHOD (Stat) (THIS_ STATSTG *pstatstg, DWORD grfStatFlag) ;
|
|
STDMETHOD (Clone) (THIS_ IStream * *ppstm) ;
|
|
|
|
CStreamOnMessage( MIDLMESSAGE *pMessage);
|
|
~CStreamOnMessage();
|
|
|
|
unsigned char *actual_buffer;
|
|
MIDLMESSAGE *message;
|
|
ULONG ref_count;
|
|
};
|
|
|
|
#endif //__STDRPC_HXX__
|