/* CallObjects: A Suite of Interfaces for Manipulating CallFrames as Objects Copyright (c) Microsoft Corporation. All rights reserved. */ import "oaidl.idl"; interface ICallInterceptor; interface ICallUnmarshal; interface ICallFrame; interface ICallFrameEvents; interface ICallFrameWalker; interface IInterfaceRelated; [uuid(D573B4B0-894E-11d2-B8B6-00C04FB9618A), object, pointer_default(unique), local] interface ICallFrame : IUnknown { typedef struct { ULONG iMethod; BOOL fHasInValues; BOOL fHasInOutValues; BOOL fHasOutValues; BOOL fDerivesFromIDispatch; LONG cInInterfacesMax; LONG cInOutInterfacesMax; LONG cOutInterfacesMax; LONG cTopLevelInInterfaces; IID iid; ULONG cMethod; ULONG cParams; } CALLFRAMEINFO; typedef struct { BOOLEAN fIn; BOOLEAN fOut; ULONG stackOffset; ULONG cbParam; } CALLFRAMEPARAMINFO; HRESULT GetInfo ( [out] CALLFRAMEINFO* pInfo ); HRESULT GetIIDAndMethod ( [out] IID* pIID, [out] ULONG* piMethod ); HRESULT GetNames ( [out] LPWSTR* pwszInterface, [out] LPWSTR* pwszMethod ); PVOID GetStackLocation (); void SetStackLocation ( [in] PVOID pvStack ); void SetReturnValue ( [in] HRESULT hr ); HRESULT GetReturnValue (); HRESULT GetParamInfo ( [in] ULONG iparam, [out] CALLFRAMEPARAMINFO* pInfo ); HRESULT SetParam ( [in] ULONG iparam, [in] VARIANT* pvar ); HRESULT GetParam ( [in] ULONG iparam, [out] VARIANT* pvar ); typedef enum { CALLFRAME_COPY_NESTED = 1, CALLFRAME_COPY_INDEPENDENT = 2 } CALLFRAME_COPY; HRESULT Copy ( [in] CALLFRAME_COPY copyControl, [in] ICallFrameWalker* pWalker, [out] ICallFrame** ppFrame ); HRESULT Free ( [in] ICallFrame* pframeArgsDest, [in] ICallFrameWalker* pWalkerDestFree, [in] ICallFrameWalker* pWalkerCopy, [in] DWORD freeFlags, [in] ICallFrameWalker* pWalkerFree, [in] DWORD nullFlags ); enum CALLFRAME_FREE { CALLFRAME_FREE_NONE = 0, CALLFRAME_FREE_IN = 1, CALLFRAME_FREE_INOUT = 2, CALLFRAME_FREE_OUT = 4, CALLFRAME_FREE_TOP_INOUT = 8, CALLFRAME_FREE_TOP_OUT = 16, CALLFRAME_FREE_ALL = 31, }; enum CALLFRAME_NULL { CALLFRAME_NULL_NONE = 0, CALLFRAME_NULL_INOUT = 2, CALLFRAME_NULL_OUT = 4, CALLFRAME_NULL_ALL = 6, }; HRESULT FreeParam ( [in] ULONG iparam, [in] DWORD freeFlags, [in] ICallFrameWalker* pWalkerFree, [in] DWORD nullFlags ); HRESULT WalkFrame ( [in] DWORD walkWhat, [in] ICallFrameWalker* pWalker ); enum CALLFRAME_WALK { CALLFRAME_WALK_IN = 1, CALLFRAME_WALK_INOUT = 2, CALLFRAME_WALK_OUT = 4, }; typedef struct { BOOLEAN fIn; DWORD dwDestContext; LPVOID pvDestContext; IUnknown* punkReserved; GUID guidTransferSyntax; } CALLFRAME_MARSHALCONTEXT; HRESULT GetMarshalSizeMax ( [in] CALLFRAME_MARSHALCONTEXT* pmshlContext, [in] MSHLFLAGS mshlflags, [out] ULONG* pcbBufferNeeded ); HRESULT Marshal ( [in] CALLFRAME_MARSHALCONTEXT* pmshlContext, [in] MSHLFLAGS mshlflags, [in,size_is(cbBuffer)] PVOID pBuffer, [in] ULONG cbBuffer, [out] ULONG* pcbBufferUsed, [out] RPCOLEDATAREP* pdataRep, [out] ULONG* prpcFlags ); HRESULT Unmarshal ( [in,size_is(cbBuffer)] PVOID pBuffer, [in] ULONG cbBuffer, [in] RPCOLEDATAREP dataRep, [in] CALLFRAME_MARSHALCONTEXT* pcontext, [out] ULONG* pcbUnmarshalled ); HRESULT ReleaseMarshalData ( [in,size_is(cbBuffer)] PVOID pBuffer, [in] ULONG cbBuffer, [in] ULONG ibFirstRelease, [in] RPCOLEDATAREP dataRep, [in] CALLFRAME_MARSHALCONTEXT* pcontext ); HRESULT Invoke ( [in] void* pvReceiver, ... ); }; [uuid(D573B4B1-894E-11d2-B8B6-00C04FB9618A), object, pointer_default(unique), local] interface ICallIndirect : IUnknown { HRESULT CallIndirect ( [out] HRESULT* phrReturn, [in] ULONG iMethod, [in] void* pvArgs, [out] ULONG* cbArgs ); HRESULT GetMethodInfo ( [in] ULONG iMethod, [out] CALLFRAMEINFO* pInfo, [out] LPWSTR* pwszMethod ); HRESULT GetStackSize ( [in] ULONG iMethod, [out] ULONG* cbArgs ); HRESULT GetIID ( [out] IID* piid, [out] BOOL* pfDerivesFromIDispatch, [out] ULONG* pcMethod, [out] LPWSTR* pwszInterface ); }; [uuid(60C7CA75-896D-11d2-B8B6-00C04FB9618A), object, pointer_default(unique), local] interface ICallInterceptor : ICallIndirect { HRESULT RegisterSink ( [in] ICallFrameEvents* psink ); HRESULT GetRegisteredSink ( [out] ICallFrameEvents** ppsink ); }; [uuid(FD5E0843-FC91-11d0-97D7-00C04FB9618A), object, pointer_default(unique), local] interface ICallFrameEvents : IUnknown { HRESULT OnCall ( [in] ICallFrame* pFrame /* A call frame bound to the just-received invocation */ ); }; [uuid(5333B003-2E42-11d2-B89D-00C04FB9618A), object, pointer_default(unique), local] interface ICallUnmarshal : IUnknown { HRESULT Unmarshal ( [in] ULONG iMethod, [in,size_is(cbBuffer)] PVOID pBuffer, [in] ULONG cbBuffer, [in] BOOL fForceBufferCopy, [in] RPCOLEDATAREP dataRep, [in] CALLFRAME_MARSHALCONTEXT *pcontext, [out] ULONG* pcbUnmarshalled, [out] ICallFrame** ppFrame ); HRESULT ReleaseMarshalData ( [in] ULONG iMethod, [in,size_is(cbBuffer)] PVOID pBuffer, [in] ULONG cbBuffer, [in] ULONG ibFirstRelease, [in] RPCOLEDATAREP dataRep, [in] CALLFRAME_MARSHALCONTEXT* pcontext ); }; [uuid(08B23919-392D-11d2-B8A4-00C04FB9618A), object, pointer_default(unique), local] interface ICallFrameWalker : IUnknown { HRESULT OnWalkInterface ( [in] REFIID iid, [in] PVOID* ppvInterface, [in] BOOL fIn, [in] BOOL fOut ); }; [uuid(D1FB5A79-7706-11d1-ADBA-00C04FC2ADC0), object, pointer_default(unique), local] interface IInterfaceRelated : IUnknown { HRESULT SetIID ( [in] REFIID iid ); HRESULT GetIID ( [out] IID* piid ); }; cpp_quote("#define CALLFRAME_E_ALREADYINVOKED _HRESULT_TYPEDEF_( 0x8004d090 )") cpp_quote("#define CALLFRAME_E_COULDNTMAKECALL _HRESULT_TYPEDEF_( 0x8004d091 )") [uuid(15B51D8B-9BF6-11d1-B888-00C04FB9618A), local] interface ICallFrameAPIs { HRESULT __stdcall CoGetInterceptor ( [in] REFIID iidIntercepted, [in] IUnknown* punkOuter, [in] REFIID iid, [out] void** ppv ); HRESULT __stdcall CoGetInterceptorFromTypeInfo ( [in] REFIID iidIntercepted, [in] IUnknown* punkOuter, [in] ITypeInfo* typeInfo, [in] REFIID iid, [out] void** ppv ); };