You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
5.4 KiB
250 lines
5.4 KiB
/*
|
|
* U N K O B J . H
|
|
*
|
|
* This is a generic definition of the IUnknown (plus GetLastError) part
|
|
* of objects that are derived from IUnknown with GetLastError.
|
|
*
|
|
* Used in:
|
|
* IPROP
|
|
*
|
|
*/
|
|
|
|
// #include <_glheap.h>
|
|
|
|
|
|
typedef struct _UNKOBJ FAR * LPUNKOBJ;
|
|
|
|
/* The instance portion of UNKOBJ structure members.
|
|
*/
|
|
typedef struct _UNKINST
|
|
{
|
|
LPALLOCATEBUFFER lpfAllocateBuffer;
|
|
LPALLOCATEMORE lpfAllocateMore;
|
|
LPFREEBUFFER lpfFreeBuffer;
|
|
LPMALLOC lpmalloc;
|
|
HINSTANCE hinst;
|
|
|
|
} UNKINST, * PUNKINST;
|
|
|
|
typedef ULONG IDS;
|
|
|
|
#ifndef BEGIN_INTERFACE
|
|
#define BEGIN_INTERFACE
|
|
#endif
|
|
|
|
/*
|
|
* Vtable alignment
|
|
*/
|
|
#ifndef VTABLE_FILL
|
|
#ifdef MAC
|
|
#define VTABLE_FILL NULL,
|
|
#else
|
|
#define VTABLE_FILL
|
|
#endif
|
|
#endif
|
|
|
|
/*============================================================================
|
|
*
|
|
* UNKOBJ (IUnknown) Class
|
|
*/
|
|
|
|
#define cchLastError 1024
|
|
|
|
#define MAPI_IMAPIUNKNOWN_METHODS(IPURE) \
|
|
MAPIMETHOD(GetLastError) \
|
|
(THIS_ HRESULT hResult, \
|
|
ULONG ulFlags, \
|
|
LPMAPIERROR FAR * lppMAPIError) IPURE; \
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE struct _UNKOBJ
|
|
|
|
#undef METHOD_PREFIX
|
|
#define METHOD_PREFIX UNKOBJ_
|
|
|
|
#undef LPVTBL_ELEM
|
|
#define LPVTBL_ELEM lpvtbl
|
|
|
|
#undef MAPIMETHOD_
|
|
#define MAPIMETHOD_(type,method) MAPIMETHOD_DECLARE(type,method,UNKOBJ_)
|
|
MAPI_IUNKNOWN_METHODS(IMPL)
|
|
MAPI_IMAPIUNKNOWN_METHODS(IMPL)
|
|
#undef MAPIMETHOD_
|
|
#define MAPIMETHOD_(type,method) STDMETHOD_(type,method)
|
|
|
|
DECLARE_MAPI_INTERFACE(UNKOBJ_)
|
|
{
|
|
BEGIN_INTERFACE
|
|
MAPI_IUNKNOWN_METHODS(IMPL)
|
|
MAPI_IMAPIUNKNOWN_METHODS(IMPL)
|
|
};
|
|
|
|
#define UNKOBJ_MEMBERS \
|
|
ULONG ulcbVtbl; \
|
|
ULONG ulcRef; \
|
|
LPIID FAR * rgpiidList; \
|
|
ULONG ulcIID; \
|
|
CRITICAL_SECTION csid; \
|
|
UNKINST * pinst; \
|
|
HRESULT hrLastError; \
|
|
IDS idsLastError; \
|
|
HLH lhHeap
|
|
|
|
typedef struct _UNKOBJ
|
|
{
|
|
UNKOBJ_Vtbl FAR * lpvtbl;
|
|
UNKOBJ_MEMBERS;
|
|
|
|
} UNKOBJ;
|
|
|
|
|
|
|
|
#ifndef WIN16
|
|
__inline VOID
|
|
UNKOBJ_EnterCriticalSection( LPUNKOBJ lpunkobj )
|
|
{
|
|
EnterCriticalSection(&lpunkobj->csid);
|
|
}
|
|
|
|
__inline VOID
|
|
UNKOBJ_LeaveCriticalSection( LPUNKOBJ lpunkobj )
|
|
{
|
|
LeaveCriticalSection(&lpunkobj->csid);
|
|
}
|
|
|
|
__inline HRESULT
|
|
UNKOBJ_HrSetLastResult( LPUNKOBJ lpunkobj,
|
|
HRESULT hResult,
|
|
IDS idsError )
|
|
{
|
|
UNKOBJ_EnterCriticalSection(lpunkobj);
|
|
lpunkobj->idsLastError = idsError;
|
|
lpunkobj->hrLastError = hResult;
|
|
UNKOBJ_LeaveCriticalSection(lpunkobj);
|
|
|
|
return hResult;
|
|
}
|
|
|
|
__inline HRESULT
|
|
UNKOBJ_HrSetLastError( LPUNKOBJ lpunkobj,
|
|
SCODE sc,
|
|
IDS idsError )
|
|
{
|
|
UNKOBJ_EnterCriticalSection(lpunkobj);
|
|
lpunkobj->idsLastError = idsError;
|
|
lpunkobj->hrLastError = ResultFromScode(sc);
|
|
UNKOBJ_LeaveCriticalSection(lpunkobj);
|
|
|
|
return ResultFromScode(sc);
|
|
}
|
|
|
|
__inline VOID
|
|
UNKOBJ_SetLastError( LPUNKOBJ lpunkobj,
|
|
SCODE sc,
|
|
IDS idsError )
|
|
{
|
|
lpunkobj->idsLastError = idsError;
|
|
lpunkobj->hrLastError = ResultFromScode(sc);
|
|
}
|
|
|
|
__inline VOID
|
|
UNKOBJ_SetLastErrorSc( LPUNKOBJ lpunkobj,
|
|
SCODE sc )
|
|
{
|
|
lpunkobj->hrLastError = ResultFromScode(sc);
|
|
}
|
|
|
|
__inline VOID
|
|
UNKOBJ_SetLastErrorIds( LPUNKOBJ lpunkobj,
|
|
IDS ids )
|
|
{
|
|
lpunkobj->idsLastError = ids;
|
|
}
|
|
#else // !WIN16
|
|
// !!! Watcom C compiler does not support inline.
|
|
// The functions are defined in UNKOBJ.C
|
|
VOID UNKOBJ_EnterCriticalSection( LPUNKOBJ lpunkobj );
|
|
VOID UNKOBJ_LeaveCriticalSection( LPUNKOBJ lpunkobj );
|
|
HRESULT UNKOBJ_HrSetLastResult( LPUNKOBJ lpunkobj, HRESULT hResult, IDS idsError );
|
|
HRESULT UNKOBJ_HrSetLastError( LPUNKOBJ lpunkobj, SCODE sc, IDS idsError );
|
|
VOID UNKOBJ_SetLastError( LPUNKOBJ lpunkobj, SCODE sc, IDS idsError );
|
|
VOID UNKOBJ_SetLastErrorSc( LPUNKOBJ lpunkobj, SCODE sc );
|
|
VOID UNKOBJ_SetLastErrorIds( LPUNKOBJ lpunkobj, IDS ids );
|
|
#endif // !WIN16
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_Init( LPUNKOBJ lpunkobj,
|
|
UNKOBJ_Vtbl FAR * lpvtblUnkobj,
|
|
ULONG ulcbVtbl,
|
|
LPIID FAR * rgpiidList,
|
|
ULONG ulcIID,
|
|
PUNKINST punkinst );
|
|
|
|
STDAPI_(VOID)
|
|
UNKOBJ_Deinit( LPUNKOBJ lpunkobj );
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScAllocate( LPUNKOBJ lpunkobj,
|
|
ULONG ulcb,
|
|
LPVOID FAR * lppv );
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScAllocateMore( LPUNKOBJ lpunkobj,
|
|
ULONG ulcb,
|
|
LPVOID lpv,
|
|
LPVOID FAR * lppv );
|
|
|
|
STDAPI_(VOID)
|
|
UNKOBJ_Free( LPUNKOBJ lpunkobj,
|
|
LPVOID lpv );
|
|
|
|
STDAPI_(VOID)
|
|
UNKOBJ_FreeRows( LPUNKOBJ lpunkobj,
|
|
LPSRowSet lprows );
|
|
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScCOAllocate( LPUNKOBJ lpunkobj,
|
|
ULONG ulcb,
|
|
LPVOID FAR * lppv );
|
|
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScCOReallocate( LPUNKOBJ lpunkobj,
|
|
ULONG ulcb,
|
|
LPVOID FAR * lplpv );
|
|
|
|
STDAPI_(VOID)
|
|
UNKOBJ_COFree( LPUNKOBJ lpunkobj,
|
|
LPVOID lpv );
|
|
|
|
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScSzFromIdsAlloc( LPUNKOBJ lpunkobj,
|
|
IDS ids,
|
|
ULONG ulFlags,
|
|
int cchBuf,
|
|
LPTSTR FAR * lpszBuf );
|
|
|
|
STDAPI_(SCODE)
|
|
UNKOBJ_ScSzFromIdsAllocMore( LPUNKOBJ lpunkobj,
|
|
IDS ids,
|
|
ULONG ulFlags,
|
|
LPVOID lpvBase,
|
|
int cchBuf,
|
|
LPTSTR FAR * lppszBuf );
|
|
|
|
|
|
/* These should be moved to a more useful (generic) location (mapidefs.h?).
|
|
*/
|
|
|
|
#ifdef WIN16
|
|
|
|
/* IsEqualGUID is used to eliminate dependency on compob(j/32).lib. This
|
|
* is only necessary on WIN16 because all other platforms define this
|
|
* already. (see objbase.h)
|
|
*/
|
|
#define IsEqualGUID(a, b) (memcmp((a), (b), sizeof(GUID)) == 0)
|
|
|
|
#endif
|