windows-nt/Source/XPSP1/NT/com/ole32/olethunk/h/interop.hxx
2020-09-26 16:20:57 +08:00

283 lines
8.2 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: interop.hxx
//
// Contents: Common definitions for the interop project
//
// History: 18-Feb-94 DrewB Created
//
//--------------------------------------------------------------------------
#ifndef __INTEROP_HXX__
#define __INTEROP_HXX__
//+---------------------------------------------------------------------------
//
// Purpose: Standard debugging support
//
// History: 18-Feb-94 DrewB Created
//
//----------------------------------------------------------------------------
#include <debnot.h>
//
// The rest of the OACF flags are defined in thunkapi.hxx. This one is here
// because it is shared between ole2.dll and olethk32.dll. The 16-bit binaries
// do not include thunkapi.hxx at the moment. KevinRo promises to fix this someday
// Feel free to fix this if you wish.
//
#define OACF_CORELTRASHMEM 0x10000000 // CorelDraw relies on the fact that
// OLE16 trashed memory during paste-
// link. Therefore, we'll go ahead
// and trash it for them if this
// flag is on.
#define OACF_CRLPNTPERSIST 0x01000000 // CorelPaint IPersistStg used in their
// OleSave screws up in QI
#define OACF_WORKSCLIPOBJ 0x00100000 // Works 3.0b creates a clipboard
// data object with a zero ref count
// Word 6 does this too. Same flag used.
// Also Paradox5, Novel/Corel WrdPft.
// They all call OleIsCurrentClipboard
// with a 0-refcount 16-bit IDataObject ptr.
#define OACF_TEXTARTDOBJ 0x00010000 // TextArt IDataAdvHolder::DAdvise has
// data object with a zero ref count
#if DBG == 1
#ifdef WIN32
DECLARE_DEBUG(thk);
#else
DECLARE_DEBUG(thk1);
#endif
#define DEB_DLL 0x0008
#define DEB_THOPS DEB_USER1
#define DEB_INVOKES DEB_USER2
#define DEB_ARGS DEB_USER3
#define DEB_NESTING DEB_USER4
#define DEB_CALLTRACE DEB_USER5
#define DEB_THUNKMGR DEB_USER6
#define DEB_MEMORY DEB_USER7
#define DEB_TLSTHK DEB_USER8
#define DEB_UNKNOWN DEB_USER9
#define DEB_FAILURES DEB_USER10
#define DEB_DLLS16 DEB_USER11
#define DEB_APIS16 DEB_USER12 // api calls to 16 bit entry point
#define DEB_DBGFAIL DEB_USER13 // Pop up dialog to allow debugging
#endif
#if DBG == 1
#ifdef WIN32
#define thkDebugOut(x) thkInlineDebugOut x
#else
#define thkDebugOut(x) thk1InlineDebugOut x
#endif
#define thkAssert(e) Win4Assert(e)
#define thkVerify(e) Win4Assert(e)
#else
#define thkDebugOut(x)
#define thkAssert(e)
#define thkVerify(e) (e)
#endif
#define OLETHUNK_DLL16NOTFOUND 0x88880002
//+---------------------------------------------------------------------------
//
// Purpose: Declarations and definitions shared across everything
//
// History: 18-Feb-94 DrewB Created
//
//----------------------------------------------------------------------------
// An IID pointer or an index into the list of known interfaces
// If the high word is zero, it's an index, otherwise it's a pointer
typedef DWORD IIDIDX;
#define IIDIDX_IS_INDEX(ii) (HIWORD(ii) == 0)
#define IIDIDX_IS_IID(ii) (!IIDIDX_IS_INDEX(ii))
#define IIDIDX_INVALID ((IIDIDX)0xffff)
#define INDEX_IIDIDX(idx) ((IIDIDX)(idx))
#define IID_IIDIDX(piid) ((IIDIDX)(piid))
#define IIDIDX_INDEX(ii) ((int)(ii))
#define IIDIDX_IID(ii) ((IID const *)(ii))
// Methods are treated as if they all existed on a single interface
// Their method numbers are biased to distinguish them from real methods
#define THK_API_BASE 0xf0000000
#define THK_API_METHOD(method) (THK_API_BASE+(method))
// Standard method indices in the vtable
#define SMI_QUERYINTERFACE 0
#define SMI_ADDREF 1
#define SMI_RELEASE 2
#define SMI_COUNT 3
#ifndef WIN32
#define UNALIGNED
#endif
//+---------------------------------------------------------------------------
//
// Struct: CALLDATA
//
// Purpose: Data describing a 16-bit call to be made on behalf of
// the 32-bit code, used since Callback16 can only pass
// one parameter
//
// History: 18-Feb-94 JohannP Created
//
//----------------------------------------------------------------------------
typedef struct tagCallData
{
DWORD vpfn;
DWORD vpvStack16;
DWORD cbStack;
} CALLDATA;
typedef CALLDATA UNALIGNED FAR *LPCALLDATA;
//+---------------------------------------------------------------------------
//
// Struct: DATA16
//
// Purpose: Data describing things in the 16-bit world that need to be
// known to the 32-bit world.
//
// History: 3-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
typedef struct tagDATA16
{
DWORD atfnProxy1632Vtbl;
DWORD fnCallbackHandler;
DWORD fnTaskAlloc;
DWORD fnTaskFree;
DWORD fnLoadProcDll;
DWORD fnUnloadProcDll;
DWORD fnCallGetClassObject;
DWORD fnCallCanUnloadNow;
DWORD fnQueryInterface16;
DWORD fnAddRef16;
DWORD fnRelease16;
DWORD fnReleaseStgMedium16;
DWORD avpfnSm16ReleaseHandlerVtbl;
DWORD fnTouchPointer16;
DWORD fnStgMediumStreamHandler16;
DWORD fnCallStub16;
DWORD fnSetOwnerPublic16;
DWORD fnWinExec16;
} DATA16;
typedef DATA16 UNALIGNED FAR * LPDATA16;
//+---------------------------------------------------------------------------
//
// Struct: LOADPROCDLLSTRUCT
//
// Purpose: Data passed to the LoadProcDll function that is called from
// the 32-bit function of similar name.
//
// History: 11-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
typedef struct tagLOADPROCDLLSTRUCT
{
DWORD vpDllName;
DWORD vpfnGetClassObject;
DWORD vpfnCanUnloadNow;
DWORD vhmodule;
} LOADPROCDLLSTRUCT;
typedef LOADPROCDLLSTRUCT UNALIGNED FAR * LPLOADPROCDLLSTRUCT;
//+---------------------------------------------------------------------------
//
// Struct: CALLGETCLASSOBJECTSTRUCT
//
// Purpose: Data passed to the CallGetClassObject function that is called
// from the 32-bit function of similar name.
//
// History: 11-Mar-94 BobDay Created
//
//----------------------------------------------------------------------------
typedef struct tagCALLGETCLASSOBJECTSTRUCT
{
DWORD vpfnGetClassObject;
CLSID clsid;
IID iid;
DWORD iface;
} CALLGETCLASSOBJECTSTRUCT;
typedef CALLGETCLASSOBJECTSTRUCT UNALIGNED FAR * LPCALLGETCLASSOBJECTSTRUCT;
//+---------------------------------------------------------------------------
//
// Struct: WINEXEC16STRUCT
//
// Purpose: Data passed to the WinExec16 function that is called from
// the 32-bit function of similar name.
//
// History: 27-Jul-94 AlexT Created
//
//----------------------------------------------------------------------------
typedef struct tagWINEXEC16STRUCT
{
DWORD vpCommandLine;
unsigned short vusShow;
} WINEXEC16STRUCT;
typedef WINEXEC16STRUCT UNALIGNED FAR * LPWINEXEC16STRUCT;
//+---------------------------------------------------------------------------
//
// Class: CSm16ReleaseHandler (srh)
//
// Purpose: Provides punkForRelease for 32->16 STGMEDIUM conversion
//
// Interface: IUnknown
//
// History: 24-Apr-94 DrewB Created
//
//----------------------------------------------------------------------------
#ifdef __cplusplus
class CSm16ReleaseHandler
{
public:
void Init(IUnknown *pUnk,
STGMEDIUM *psm32,
STGMEDIUM UNALIGNED *psm16,
IUnknown *punkForRelease,
CLIPFORMAT cfFormat);
void CallFailed() {
_punkForRelease = NULL;
}
DWORD _avpfnVtbl;
STGMEDIUM _sm32;
STGMEDIUM _sm16;
IUnknown *_punkForRelease;
LONG _cReferences;
CLIPFORMAT _cfFormat;
IUnknown *_pUnkThkMgr;
};
#endif
#endif // __INTEROP_HXX__