976 lines
31 KiB
C
976 lines
31 KiB
C
|
// compobj.h - component object model definitions
|
||
|
|
||
|
#if !defined( _COMPOBJ_H_ )
|
||
|
#define _COMPOBJ_H_
|
||
|
|
||
|
|
||
|
/****** Linkage Definitions *************************************************/
|
||
|
|
||
|
/*
|
||
|
* These are macros for declaring methods/functions. They exist so that
|
||
|
* control over the use of keywords (CDECL, PASCAL, __export,
|
||
|
* extern "C") resides in one place, and because this is the least
|
||
|
* intrusive way of writing function declarations that do not have
|
||
|
* to be modified in order to port to the Mac.
|
||
|
*
|
||
|
* The macros without the trailing underscore are for functions/methods
|
||
|
* which a return value of type HRESULT; this is by far the most common
|
||
|
* case in OLE. The macros with a trailing underscore take a return
|
||
|
* type as a parameter.
|
||
|
*
|
||
|
* WARNING: STDAPI is hard coded into the LPFNGETCLASSOBJECT typedef below.
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#define EXTERN_C extern "C"
|
||
|
#else
|
||
|
#define EXTERN_C extern
|
||
|
#endif
|
||
|
|
||
|
#ifdef _MAC
|
||
|
#define STDMETHODCALLTYPE
|
||
|
#define STDAPICALLTYPE pascal
|
||
|
|
||
|
#define STDAPI EXTERN_C STDAPICALLTYPE HRESULT
|
||
|
#define STDAPI_(type) EXTERN_C STDAPICALLTYPE type
|
||
|
|
||
|
#else // !_MAC
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#define STDMETHODCALLTYPE __export __cdecl
|
||
|
#define STDAPICALLTYPE __export __stdcall
|
||
|
|
||
|
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
|
||
|
#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
|
||
|
|
||
|
#else
|
||
|
#define STDMETHODCALLTYPE __export FAR CDECL
|
||
|
#define STDAPICALLTYPE __export FAR PASCAL
|
||
|
|
||
|
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
|
||
|
#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif //!_MAC
|
||
|
|
||
|
#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
|
||
|
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
|
||
|
|
||
|
|
||
|
/****** Interface Declaration ***********************************************/
|
||
|
|
||
|
/*
|
||
|
* These are macros for declaring interfaces. They exist so that
|
||
|
* a single definition of the interface is simulataneously a proper
|
||
|
* declaration of the interface structures (C++ abstract classes)
|
||
|
* for both C and C++.
|
||
|
*
|
||
|
* DECLARE_INTERFACE(iface) is used to declare an interface that does
|
||
|
* not derive from a base interface.
|
||
|
* DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
|
||
|
* that does derive from a base interface.
|
||
|
*
|
||
|
* By default if the source file has a .c extension the C version of
|
||
|
* the interface declaratations will be expanded; if it has a .cpp
|
||
|
* extension the C++ version will be expanded. if you want to force
|
||
|
* the C version expansion even though the source file has a .cpp
|
||
|
* extension, then define the macro "CINTERFACE".
|
||
|
* eg. cl -DCINTERFACE file.cpp
|
||
|
*
|
||
|
* Example Interface declaration:
|
||
|
*
|
||
|
* #undef INTERFACE
|
||
|
* #define INTERFACE IClassFactory
|
||
|
*
|
||
|
* DECLARE_INTERFACE_(IClassFactory, IUnknown)
|
||
|
* {
|
||
|
* // *** IUnknown methods ***
|
||
|
* STDMETHOD(QueryInterface) (THIS_
|
||
|
* REFIID riid,
|
||
|
* LPVOID FAR* ppvObj) PURE;
|
||
|
* STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
* STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
*
|
||
|
* // *** IClassFactory methods ***
|
||
|
* STDMETHOD(CreateInstance) (THIS_
|
||
|
* LPUNKNOWN pUnkOuter,
|
||
|
* REFIID riid,
|
||
|
* LPVOID FAR* ppvObject) PURE;
|
||
|
* };
|
||
|
*
|
||
|
* Example C++ expansion:
|
||
|
*
|
||
|
* struct FAR IClassFactory : public IUnknown
|
||
|
* {
|
||
|
* virtual HRESULT STDMETHODCALLTYPE QueryInterface(
|
||
|
* IID FAR& riid,
|
||
|
* LPVOID FAR* ppvObj) = 0;
|
||
|
* virtual HRESULT STDMETHODCALLTYPE AddRef(void) = 0;
|
||
|
* virtual HRESULT STDMETHODCALLTYPE Release(void) = 0;
|
||
|
* virtual HRESULT STDMETHODCALLTYPE CreateInstance(
|
||
|
* LPUNKNOWN pUnkOuter,
|
||
|
* IID FAR& riid,
|
||
|
* LPVOID FAR* ppvObject) = 0;
|
||
|
* };
|
||
|
*
|
||
|
* NOTE: Our documentation says '#define interface class' but we use
|
||
|
* 'struct' instead of 'class' to keep a lot of 'public:' lines
|
||
|
* out of the interfaces. The 'FAR' forces the 'this' pointers to
|
||
|
* be far, which is what we need.
|
||
|
*
|
||
|
* Example C expansion:
|
||
|
*
|
||
|
* typedef struct IClassFactory
|
||
|
* {
|
||
|
* const struct IClassFactoryVtbl FAR* lpVtbl;
|
||
|
* } IClassFactory;
|
||
|
*
|
||
|
* typedef struct IClassFactoryVtbl IClassFactoryVtbl;
|
||
|
*
|
||
|
* struct IClassFactoryVtbl
|
||
|
* {
|
||
|
* HRESULT (STDMETHODCALLTYPE * QueryInterface) (
|
||
|
* IClassFactory FAR* This,
|
||
|
* IID FAR* riid,
|
||
|
* LPVOID FAR* ppvObj) ;
|
||
|
* HRESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
|
||
|
* HRESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
|
||
|
* HRESULT (STDMETHODCALLTYPE * CreateInstance) (
|
||
|
* IClassFactory FAR* This,
|
||
|
* LPUNKNOWN pUnkOuter,
|
||
|
* IID FAR* riid,
|
||
|
* LPVOID FAR* ppvObject);
|
||
|
* HRESULT (STDMETHODCALLTYPE * LockServer) (
|
||
|
* IClassFactory FAR* This,
|
||
|
* BOOL fLock);
|
||
|
* };
|
||
|
*/
|
||
|
|
||
|
|
||
|
#if defined(__cplusplus) && !defined(CINTERFACE)
|
||
|
#ifdef __TURBOC__
|
||
|
#define interface struct huge
|
||
|
#else
|
||
|
#define interface struct FAR
|
||
|
#endif
|
||
|
#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
|
||
|
#define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
|
||
|
#define PURE = 0
|
||
|
#define THIS_
|
||
|
#define THIS void
|
||
|
#define DECLARE_INTERFACE(iface) interface iface
|
||
|
#define DECLARE_INTERFACE_(iface, baseiface) interface iface : public baseiface
|
||
|
|
||
|
#else
|
||
|
#define interface struct
|
||
|
|
||
|
#ifdef _MAC
|
||
|
|
||
|
#define STDMETHOD(method) long method##pad;\
|
||
|
HRESULT (STDMETHODCALLTYPE * method)
|
||
|
#define STDMETHOD_(type,method) long method##pad;\
|
||
|
type (STDMETHODCALLTYPE * method)
|
||
|
|
||
|
#else // _MAC
|
||
|
|
||
|
#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method)
|
||
|
#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
|
||
|
|
||
|
#endif // !_MAC
|
||
|
|
||
|
#define PURE
|
||
|
#define THIS_ INTERFACE FAR* This,
|
||
|
#define THIS INTERFACE FAR* This
|
||
|
#ifdef CONST_VTABLE
|
||
|
#define DECLARE_INTERFACE(iface) typedef interface iface { \
|
||
|
const struct iface##Vtbl FAR* lpVtbl; \
|
||
|
} iface; \
|
||
|
typedef const struct iface##Vtbl iface##Vtbl; \
|
||
|
const struct iface##Vtbl
|
||
|
#else
|
||
|
#define DECLARE_INTERFACE(iface) typedef interface iface { \
|
||
|
struct iface##Vtbl FAR* lpVtbl; \
|
||
|
} iface; \
|
||
|
typedef struct iface##Vtbl iface##Vtbl; \
|
||
|
struct iface##Vtbl
|
||
|
#endif
|
||
|
#define DECLARE_INTERFACE_(iface, baseiface) DECLARE_INTERFACE(iface)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/****** Additional basic types **********************************************/
|
||
|
|
||
|
|
||
|
#ifndef FARSTRUCT
|
||
|
#ifdef __cplusplus
|
||
|
#define FARSTRUCT FAR
|
||
|
#else
|
||
|
#define FARSTRUCT
|
||
|
#endif // __cplusplus
|
||
|
#endif // FARSTRUCT
|
||
|
|
||
|
|
||
|
#ifndef WINAPI /* If not included with 3.1 headers... */
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#define FAR
|
||
|
#define PASCAL __stdcall
|
||
|
#define CDECL
|
||
|
#else
|
||
|
#define FAR _far
|
||
|
#define PASCAL _pascal
|
||
|
#define CDECL _cdecl
|
||
|
#endif
|
||
|
|
||
|
#define VOID void
|
||
|
#define WINAPI FAR PASCAL
|
||
|
#define CALLBACK FAR PASCAL
|
||
|
|
||
|
#ifndef FALSE
|
||
|
#define FALSE 0
|
||
|
#define TRUE 1
|
||
|
#endif
|
||
|
|
||
|
typedef int BOOL;
|
||
|
typedef unsigned char BYTE;
|
||
|
typedef unsigned short WORD;
|
||
|
typedef unsigned int UINT;
|
||
|
|
||
|
typedef long LONG;
|
||
|
typedef unsigned long DWORD;
|
||
|
|
||
|
|
||
|
typedef UINT WPARAM;
|
||
|
typedef LONG LPARAM;
|
||
|
typedef LONG LRESULT;
|
||
|
|
||
|
typedef unsigned int HANDLE;
|
||
|
#define DECLARE_HANDLE(name) typedef UINT name
|
||
|
|
||
|
DECLARE_HANDLE(HMODULE);
|
||
|
DECLARE_HANDLE(HINSTANCE);
|
||
|
DECLARE_HANDLE(HLOCAL);
|
||
|
DECLARE_HANDLE(HGLOBAL);
|
||
|
DECLARE_HANDLE(HDC);
|
||
|
DECLARE_HANDLE(HRGN);
|
||
|
DECLARE_HANDLE(HWND);
|
||
|
DECLARE_HANDLE(HMENU);
|
||
|
DECLARE_HANDLE(HACCEL);
|
||
|
DECLARE_HANDLE(HTASK);
|
||
|
|
||
|
#ifndef NULL
|
||
|
#define NULL 0
|
||
|
#endif
|
||
|
|
||
|
|
||
|
typedef void FAR * LPVOID;
|
||
|
typedef WORD FAR * LPWORD;
|
||
|
typedef DWORD FAR * LPDWORD;
|
||
|
typedef char FAR* LPSTR;
|
||
|
typedef const char FAR* LPCSTR;
|
||
|
typedef void FAR* LPLOGPALETTE;
|
||
|
typedef void FAR* LPMSG;
|
||
|
//typedef struct tagMSG FAR *LPMSG;
|
||
|
|
||
|
typedef HANDLE FAR *LPHANDLE;
|
||
|
typedef struct tagRECT FAR *LPRECT;
|
||
|
|
||
|
typedef struct FARSTRUCT tagSIZE
|
||
|
{
|
||
|
int cx;
|
||
|
int cy;
|
||
|
} SIZE;
|
||
|
typedef SIZE* PSIZE;
|
||
|
|
||
|
|
||
|
#endif /* WINAPI */
|
||
|
|
||
|
|
||
|
typedef short SHORT;
|
||
|
typedef unsigned short USHORT;
|
||
|
typedef DWORD ULONG;
|
||
|
|
||
|
|
||
|
#ifndef HUGEP
|
||
|
#ifdef WIN32
|
||
|
#define HUGEP
|
||
|
#else
|
||
|
#define HUGEP __huge
|
||
|
#endif // WIN32
|
||
|
#endif // HUGEP
|
||
|
|
||
|
typedef WORD WCHAR;
|
||
|
|
||
|
#ifndef WIN32
|
||
|
typedef struct FARSTRUCT _LARGE_INTEGER {
|
||
|
DWORD LowPart;
|
||
|
LONG HighPart;
|
||
|
} LARGE_INTEGER, *PLARGE_INTEGER;
|
||
|
#endif
|
||
|
#define LISet32(li, v) ((li).HighPart = ((LONG)(v)) < 0 ? -1 : 0, (li).LowPart = (v))
|
||
|
|
||
|
#ifndef WIN32
|
||
|
typedef struct FARSTRUCT _ULARGE_INTEGER {
|
||
|
DWORD LowPart;
|
||
|
DWORD HighPart;
|
||
|
} ULARGE_INTEGER, *PULARGE_INTEGER;
|
||
|
#endif
|
||
|
#define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))
|
||
|
|
||
|
#ifndef _WINDOWS_
|
||
|
#ifndef _FILETIME_
|
||
|
#define _FILETIME_
|
||
|
typedef struct FARSTRUCT tagFILETIME
|
||
|
{
|
||
|
DWORD dwLowDateTime;
|
||
|
DWORD dwHighDateTime;
|
||
|
} FILETIME;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#define HTASK DWORD
|
||
|
#endif
|
||
|
|
||
|
#include "scode.h"
|
||
|
|
||
|
|
||
|
|
||
|
// *********************** Compobj errors **********************************
|
||
|
|
||
|
#define CO_E_NOTINITIALIZED (CO_E_FIRST + 0x0)
|
||
|
// CoInitialize has not been called and must be
|
||
|
|
||
|
#define CO_E_ALREADYINITIALIZED (CO_E_FIRST + 0x1)
|
||
|
// CoInitialize has already been called and cannot be called again (temporary)
|
||
|
|
||
|
#define CO_E_CANTDETERMINECLASS (CO_E_FIRST + 0x2)
|
||
|
// can't determine clsid (e.g., extension not in reg.dat)
|
||
|
|
||
|
#define CO_E_CLASSSTRING (CO_E_FIRST + 0x3)
|
||
|
// the string form of the clsid is invalid (including ole1 classes)
|
||
|
|
||
|
#define CO_E_IIDSTRING (CO_E_FIRST + 0x4)
|
||
|
// the string form of the iid is invalid
|
||
|
|
||
|
#define CO_E_APPNOTFOUND (CO_E_FIRST + 0x5)
|
||
|
// application not found
|
||
|
|
||
|
#define CO_E_APPSINGLEUSE (CO_E_FIRST + 0x6)
|
||
|
// application cannot be run more than once
|
||
|
|
||
|
#define CO_E_ERRORINAPP (CO_E_FIRST + 0x7)
|
||
|
// some error in the app program file
|
||
|
|
||
|
#define CO_E_DLLNOTFOUND (CO_E_FIRST + 0x8)
|
||
|
// dll not found
|
||
|
|
||
|
#define CO_E_ERRORINDLL (CO_E_FIRST + 0x9)
|
||
|
// some error in the dll file
|
||
|
|
||
|
#define CO_E_WRONGOSFORAPP (CO_E_FIRST + 0xa)
|
||
|
// app written for other version of OS or other OS altogether
|
||
|
|
||
|
#define CO_E_OBJNOTREG (CO_E_FIRST + 0xb)
|
||
|
// object is not registered
|
||
|
|
||
|
#define CO_E_OBJISREG (CO_E_FIRST + 0xc)
|
||
|
// object is already registered
|
||
|
|
||
|
#define CO_E_OBJNOTCONNECTED (CO_E_FIRST + 0xd)
|
||
|
// handler is not connected to server
|
||
|
|
||
|
#define CO_E_APPDIDNTREG (CO_E_FIRST + 0xe)
|
||
|
// app was launched, but didn't registered a class factory
|
||
|
|
||
|
|
||
|
// ********************* ClassObject errors ********************************
|
||
|
|
||
|
#define CLASS_E_NOAGGREGATION (CLASSFACTORY_E_FIRST + 0x0)
|
||
|
// class does not support aggregation (or class object is remote)
|
||
|
|
||
|
|
||
|
// *********************** Reg.dat errors **********************************
|
||
|
|
||
|
#define REGDB_E_READREGDB (REGDB_E_FIRST + 0x0)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
#define REGDB_E_WRITEREGDB (REGDB_E_FIRST + 0x1)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
#define REGDB_E_KEYMISSING (REGDB_E_FIRST + 0x2)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
#define REGDB_E_INVALIDVALUE (REGDB_E_FIRST + 0x3)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
#define REGDB_E_CLASSNOTREG (REGDB_E_FIRST + 0x4)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
#define REGDB_E_IIDNOTREG (REGDB_E_FIRST + 0x5)
|
||
|
// some error reading the registration database
|
||
|
|
||
|
|
||
|
// *************************** RPC errors **********************************
|
||
|
|
||
|
#define RPC_E_FIRST MAKE_SCODE(SEVERITY_ERROR, FACILITY_RPC, 0x000)
|
||
|
|
||
|
// call was rejected by callee, either by MF::HandleIncomingCall or
|
||
|
#define RPC_E_CALL_REJECTED (RPC_E_FIRST + 0x1)
|
||
|
|
||
|
// call was canceld by call - returned by MessagePending
|
||
|
// this code only occurs if MessagePending return cancel
|
||
|
#define RPC_E_CALL_CANCELED (RPC_E_FIRST + 0x2)
|
||
|
|
||
|
// the caller is dispatching an intertask SendMessage call and
|
||
|
// can NOT call out via PostMessage
|
||
|
#define RPC_E_CANTPOST_INSENDCALL (RPC_E_FIRST + 0x3)
|
||
|
|
||
|
// the caller is dispatching an asynchronus call can NOT
|
||
|
// make an outgoing call on behalf of this call
|
||
|
#define RPC_E_CANTCALLOUT_INASYNCCALL (RPC_E_FIRST + 0x4)
|
||
|
|
||
|
// the caller is not in a state where an outgoing call can be made
|
||
|
// this is the case if the caller has an outstandig call and
|
||
|
// another incoming call was excepted by HIC; now the caller is
|
||
|
// not allowed to call out again
|
||
|
#define RPC_E_CANTCALLOUT_INEXTERNALCALL (RPC_E_FIRST + 0x5)
|
||
|
|
||
|
// the connection terminated or is in a bogus state
|
||
|
// and can not be used any more. Other connections
|
||
|
// are still valid.
|
||
|
#define RPC_E_CONNECTION_TERMINATED (RPC_E_FIRST + 0x6)
|
||
|
|
||
|
// the callee (server [not server application]) is not available
|
||
|
// and disappeared; all connections are invalid
|
||
|
#define RPC_E_SERVER_DIED (RPC_E_FIRST + 0x7)
|
||
|
|
||
|
// the caller (client ) disappeared while the callee (server) was
|
||
|
// processing a call
|
||
|
#define RPC_E_CLIENT_DIED (RPC_E_FIRST + 0x8)
|
||
|
|
||
|
// the date paket with the marshalled parameter data is
|
||
|
// incorrect
|
||
|
#define RPC_E_INVALID_DATAPACKET (RPC_E_FIRST + 0x9)
|
||
|
|
||
|
// the call was not transmitted properly; the message queue
|
||
|
// was full and was not emptied after yielding
|
||
|
#define RPC_E_CANTTRANSMIT_CALL (RPC_E_FIRST + 0xa)
|
||
|
|
||
|
// the client (caller) can not marshall the parameter data
|
||
|
// or unmarshall the return data - low memory etc.
|
||
|
#define RPC_E_CLIENT_CANTMARSHAL_DATA (RPC_E_FIRST + 0xb)
|
||
|
#define RPC_E_CLIENT_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xc)
|
||
|
|
||
|
// the server (caller) can not unmarshall the parameter data
|
||
|
// or marshall the return data - low memory
|
||
|
#define RPC_E_SERVER_CANTMARSHAL_DATA (RPC_E_FIRST + 0xd)
|
||
|
#define RPC_E_SERVER_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xe)
|
||
|
|
||
|
// received data are invalid; can be server or
|
||
|
// client data
|
||
|
#define RPC_E_INVALID_DATA (RPC_E_FIRST + 0xf)
|
||
|
|
||
|
// a particular parameter is invalid and can not be un/marshalled
|
||
|
#define RPC_E_INVALID_PARAMETER (RPC_E_FIRST + 0x10)
|
||
|
|
||
|
// a internal error occured
|
||
|
#define RPC_E_UNEXPECTED (RPC_E_FIRST + 0xFFFF)
|
||
|
|
||
|
|
||
|
/****** Globally Unique Ids *************************************************/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
|
||
|
struct FAR GUID
|
||
|
{
|
||
|
DWORD Data1;
|
||
|
WORD Data2;
|
||
|
WORD Data3;
|
||
|
BYTE Data4[8];
|
||
|
|
||
|
BOOL operator==(const GUID& iidOther) const
|
||
|
|
||
|
#ifdef WIN32
|
||
|
{ return !memcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
|
||
|
#else
|
||
|
{ return !_fmemcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
|
||
|
#endif
|
||
|
BOOL operator!=(const GUID& iidOther) const
|
||
|
{ return !((*this) == iidOther); }
|
||
|
};
|
||
|
|
||
|
#else
|
||
|
typedef struct GUID
|
||
|
{
|
||
|
DWORD Data1;
|
||
|
WORD Data2;
|
||
|
WORD Data3;
|
||
|
BYTE Data4[8];
|
||
|
} GUID;
|
||
|
#endif
|
||
|
|
||
|
typedef GUID FAR* LPGUID;
|
||
|
|
||
|
|
||
|
// macros to define byte pattern for a GUID.
|
||
|
// Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
|
||
|
//
|
||
|
// Each dll/exe must initialize the GUIDs once. This is done in one of
|
||
|
// two ways. If you are not using precompiled headers for the file(s) which
|
||
|
// initializes the GUIDs, define INITGUID before including compobj.h. This
|
||
|
// is how OLE builds the initialized versions of the GUIDs which are included
|
||
|
// in ole2.lib. The GUIDs in ole2.lib are all defined in the same text
|
||
|
// segment GUID_TEXT.
|
||
|
//
|
||
|
// The alternative (which some versions of the compiler don't handle properly;
|
||
|
// they wind up with the initialized GUIDs in a data, not a text segment),
|
||
|
// is to use a precompiled version of compobj.h and then include initguid.h
|
||
|
// after compobj.h followed by one or more of the guid defintion files.
|
||
|
|
||
|
|
||
|
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||
|
EXTERN_C const GUID CDECL FAR name
|
||
|
|
||
|
#ifdef INITGUID
|
||
|
#include "initguid.h"
|
||
|
#endif
|
||
|
|
||
|
#define DEFINE_OLEGUID(name, l, w1, w2) \
|
||
|
DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
|
||
|
|
||
|
|
||
|
// Interface ID are just a kind of GUID
|
||
|
typedef GUID IID;
|
||
|
typedef IID FAR* LPIID;
|
||
|
#define IID_NULL GUID_NULL
|
||
|
#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
|
||
|
|
||
|
|
||
|
// Class ID are just a kind of GUID
|
||
|
typedef GUID CLSID;
|
||
|
typedef CLSID FAR* LPCLSID;
|
||
|
#define CLSID_NULL GUID_NULL
|
||
|
#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
|
||
|
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
#define REFGUID const GUID FAR&
|
||
|
#define REFIID const IID FAR&
|
||
|
#define REFCLSID const CLSID FAR&
|
||
|
#else
|
||
|
#define REFGUID const GUID FAR* const
|
||
|
#define REFIID const IID FAR* const
|
||
|
#define REFCLSID const CLSID FAR* const
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef INITGUID
|
||
|
#include "coguid.h"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/****** Other value types ***************************************************/
|
||
|
|
||
|
// memory context values; passed to CoGetMalloc
|
||
|
typedef enum tagMEMCTX
|
||
|
{
|
||
|
MEMCTX_TASK = 1, // task (private) memory
|
||
|
MEMCTX_SHARED = 2, // shared memory (between processes)
|
||
|
#ifdef _MAC
|
||
|
MEMCTX_MACSYSTEM = 3, // on the mac, the system heap
|
||
|
#endif
|
||
|
|
||
|
// these are mostly for internal use...
|
||
|
MEMCTX_UNKNOWN = -1, // unknown context (when asked about it)
|
||
|
MEMCTX_SAME = -2, // same context (as some other pointer)
|
||
|
} MEMCTX;
|
||
|
|
||
|
|
||
|
|
||
|
// class context: used to determine what scope and kind of class object to use
|
||
|
// NOTE: this is a bitwise enum
|
||
|
typedef enum tagCLSCTX
|
||
|
{
|
||
|
CLSCTX_INPROC_SERVER = 1, // server dll (runs in same process as caller)
|
||
|
CLSCTX_INPROC_HANDLER = 2, // handler dll (runs in same process as caller)
|
||
|
CLSCTX_LOCAL_SERVER = 4 // server exe (runs on same machine; diff proc)
|
||
|
} CLSCTX;
|
||
|
|
||
|
#define CLSCTX_ALL (CLSCTX_INPROC_SERVER| \
|
||
|
CLSCTX_INPROC_HANDLER| \
|
||
|
CLSCTX_LOCAL_SERVER)
|
||
|
|
||
|
#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)
|
||
|
|
||
|
#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)
|
||
|
|
||
|
|
||
|
// class registration flags; passed to CoRegisterClassObject
|
||
|
typedef enum tagREGCLS
|
||
|
{
|
||
|
REGCLS_SINGLEUSE = 0, // class object only generates one instance
|
||
|
REGCLS_MULTIPLEUSE = 1 // same class object genereates multiple inst.
|
||
|
} REGCLS;
|
||
|
|
||
|
|
||
|
// interface marshaling definitions
|
||
|
#define MARSHALINTERFACE_MIN 40 // minimum number of bytes for interface marshl
|
||
|
|
||
|
// marshaling flags; passed to CoMarshalInterface
|
||
|
typedef enum tagMSHLFLAGS
|
||
|
{
|
||
|
MSHLFLAGS_NORMAL = 0, // normal marshaling via proxy/stub
|
||
|
MSHLFLAGS_TABLESTRONG = 1, // keep object alive; must explicitly release
|
||
|
MSHLFLAGS_TABLEWEAK = 2 // doesn't hold object alive; still must release
|
||
|
} MSHLFLAGS;
|
||
|
|
||
|
// marshal context: determines the destination context of the marshal operation
|
||
|
typedef enum tagMSHCTX
|
||
|
{
|
||
|
MSHCTX_LOCAL = 0, // unmarshal context is local (eg.shared memory)
|
||
|
MSHCTX_NOSHAREDMEM = 1, // unmarshal context has no shared memory access
|
||
|
} MSHCTX;
|
||
|
|
||
|
|
||
|
// call type used by IMessageFilter::HandleIncommingMessage
|
||
|
typedef enum tagCALLTYPE
|
||
|
{
|
||
|
CALLTYPE_TOPLEVEL = 1, // toplevel call - no outgoing call
|
||
|
CALLTYPE_NESTED = 2, // callback on behalf of previous outgoing call - should always handle
|
||
|
CALLTYPE_ASYNC = 3, // aysnchronous call - can NOT be rejected
|
||
|
CALLTYPE_TOPLEVEL_CALLPENDING = 4, // new toplevel call with new LID
|
||
|
CALLTYPE_ASYNC_CALLPENDING = 5 // async call - can NOT be rejected
|
||
|
} CALLTYPE;
|
||
|
|
||
|
// status of server call - returned by IMessageFilter::HandleIncommingCall
|
||
|
// and passed to IMessageFilter::RetryRejectedCall
|
||
|
typedef enum tagSERVERCALL
|
||
|
{
|
||
|
SERVERCALL_ISHANDLED = 0,
|
||
|
SERVERCALL_REJECTED = 1,
|
||
|
SERVERCALL_RETRYLATER = 2
|
||
|
} SERVERCALL;
|
||
|
|
||
|
|
||
|
// Pending type indicates the level of nesting
|
||
|
typedef enum tagPENDINGTYPE
|
||
|
{
|
||
|
PENDINGTYPE_TOPLEVEL = 1, // toplevel call
|
||
|
PENDINGTYPE_NESTED = 2, // nested call
|
||
|
} PENDINGTYPE;
|
||
|
|
||
|
// return values of MessagePending
|
||
|
typedef enum tagPENDINGMSG
|
||
|
{
|
||
|
PENDINGMSG_CANCELCALL = 0, // cancel the outgoing call
|
||
|
PENDINGMSG_WAITNOPROCESS = 1, // wait for the return and don't dispatch the message
|
||
|
PENDINGMSG_WAITDEFPROCESS = 2 // wait and dispatch the message
|
||
|
|
||
|
} PENDINGMSG;
|
||
|
|
||
|
|
||
|
/****** IUnknown Interface **************************************************/
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IUnknown
|
||
|
|
||
|
DECLARE_INTERFACE(IUnknown)
|
||
|
{
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
};
|
||
|
typedef IUnknown FAR* LPUNKNOWN;
|
||
|
|
||
|
|
||
|
/****** Class Factory Interface *******************************************/
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IClassFactory
|
||
|
|
||
|
DECLARE_INTERFACE_(IClassFactory, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IClassFactory methods ***
|
||
|
STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter,
|
||
|
REFIID riid,
|
||
|
LPVOID FAR* ppvObject) PURE;
|
||
|
STDMETHOD(LockServer) (THIS_ BOOL fLock) PURE;
|
||
|
|
||
|
};
|
||
|
typedef IClassFactory FAR* LPCLASSFACTORY;
|
||
|
|
||
|
|
||
|
/****** Memory Allocation Interface ***************************************/
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMalloc
|
||
|
|
||
|
DECLARE_INTERFACE_(IMalloc, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IMalloc methods ***
|
||
|
STDMETHOD_(void FAR*, Alloc) (THIS_ ULONG cb) PURE;
|
||
|
STDMETHOD_(void FAR*, Realloc) (THIS_ void FAR* pv, ULONG cb) PURE;
|
||
|
STDMETHOD_(void, Free) (THIS_ void FAR* pv) PURE;
|
||
|
STDMETHOD_(ULONG, GetSize) (THIS_ void FAR* pv) PURE;
|
||
|
STDMETHOD_(int, DidAlloc) (THIS_ void FAR* pv) PURE;
|
||
|
STDMETHOD_(void, HeapMinimize) (THIS) PURE;
|
||
|
};
|
||
|
typedef IMalloc FAR* LPMALLOC;
|
||
|
|
||
|
|
||
|
/****** IMarshal Interface ************************************************/
|
||
|
|
||
|
// forward declaration for IStream; must include storage.h later to use
|
||
|
#ifdef __cplusplus
|
||
|
interface IStream;
|
||
|
#else
|
||
|
typedef interface IStream IStream;
|
||
|
#endif
|
||
|
typedef IStream FAR* LPSTREAM;
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMarshal
|
||
|
|
||
|
DECLARE_INTERFACE_(IMarshal, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IMarshal methods ***
|
||
|
STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv,
|
||
|
DWORD dwDestContext, LPVOID pvDestContext,
|
||
|
DWORD mshlflags, LPCLSID pCid) PURE;
|
||
|
STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv,
|
||
|
DWORD dwDestContext, LPVOID pvDestContext,
|
||
|
DWORD mshlflags, LPDWORD pSize) PURE;
|
||
|
STDMETHOD(MarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
|
||
|
LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
|
||
|
DWORD mshlflags) PURE;
|
||
|
STDMETHOD(UnmarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
|
||
|
LPVOID FAR* ppv) PURE;
|
||
|
STDMETHOD(ReleaseMarshalData)(THIS_ LPSTREAM pStm) PURE;
|
||
|
STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved) PURE;
|
||
|
};
|
||
|
typedef IMarshal FAR* LPMARSHAL;
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IStdMarshalInfo
|
||
|
|
||
|
DECLARE_INTERFACE_(IStdMarshalInfo, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IStdMarshalInfo methods ***
|
||
|
STDMETHOD(GetClassForHandler)(THIS_ DWORD dwDestContext,
|
||
|
LPVOID pvDestContext, LPCLSID pClsid) PURE;
|
||
|
};
|
||
|
typedef IStdMarshalInfo FAR* LPSTDMARSHALINFO;
|
||
|
|
||
|
|
||
|
/****** Message Filter Interface *******************************************/
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IMessageFilter
|
||
|
|
||
|
DECLARE_INTERFACE_(IMessageFilter, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IMessageFilter methods ***
|
||
|
STDMETHOD_(DWORD, HandleInComingCall) (THIS_ DWORD dwCallType,
|
||
|
HTASK htaskCaller, DWORD dwTickCount,
|
||
|
DWORD dwReserved ) PURE;
|
||
|
STDMETHOD_(DWORD, RetryRejectedCall) (THIS_
|
||
|
HTASK htaskCallee, DWORD dwTickCount,
|
||
|
DWORD dwRejectType ) PURE;
|
||
|
STDMETHOD_(DWORD, MessagePending) (THIS_
|
||
|
HTASK htaskCallee, DWORD dwTickCount,
|
||
|
DWORD dwPendingType ) PURE;
|
||
|
};
|
||
|
typedef IMessageFilter FAR* LPMESSAGEFILTER;
|
||
|
|
||
|
|
||
|
/****** Enumerator Interfaces *********************************************/
|
||
|
|
||
|
/*
|
||
|
* Since we don't use parametrized types, we put in explicit declarations
|
||
|
* of the enumerators we need.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IEnumString
|
||
|
|
||
|
DECLARE_INTERFACE_(IEnumString, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IEnumString methods ***
|
||
|
STDMETHOD(Next) (THIS_ ULONG celt,
|
||
|
LPSTR FAR* rgelt,
|
||
|
ULONG FAR* pceltFetched) PURE;
|
||
|
STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
|
||
|
STDMETHOD(Reset) (THIS) PURE;
|
||
|
STDMETHOD(Clone) (THIS_ IEnumString FAR* FAR* ppenm) PURE;
|
||
|
};
|
||
|
typedef IEnumString FAR* LPENUMSTRING;
|
||
|
|
||
|
|
||
|
#undef INTERFACE
|
||
|
#define INTERFACE IEnumUnknown
|
||
|
|
||
|
DECLARE_INTERFACE_(IEnumUnknown, IUnknown)
|
||
|
{
|
||
|
// *** IUnknown methods ***
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
|
||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||
|
|
||
|
// *** IEnumUnknown methods ***
|
||
|
STDMETHOD(Next) (THIS_ ULONG celt, LPUNKNOWN FAR* rgelt, ULONG FAR* pceltFetched) PURE;
|
||
|
STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
|
||
|
STDMETHOD(Reset) (THIS) PURE;
|
||
|
STDMETHOD(Clone) (THIS_ IEnumUnknown FAR* FAR* ppenm) PURE;
|
||
|
};
|
||
|
typedef IEnumUnknown FAR* LPENUMUNKNOWN;
|
||
|
|
||
|
|
||
|
/****** STD Object API Prototypes *****************************************/
|
||
|
|
||
|
STDAPI_(DWORD) CoBuildVersion( VOID );
|
||
|
|
||
|
/* init/uninit */
|
||
|
|
||
|
STDAPI CoInitialize(LPMALLOC pMalloc);
|
||
|
STDAPI_(void) CoUninitialize(void);
|
||
|
STDAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC FAR* ppMalloc);
|
||
|
STDAPI_(DWORD) CoGetCurrentProcess(void);
|
||
|
|
||
|
|
||
|
/* register/revoke/get class objects */
|
||
|
|
||
|
STDAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved,
|
||
|
REFIID riid, LPVOID FAR* ppv);
|
||
|
STDAPI CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk,
|
||
|
DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister);
|
||
|
STDAPI CoRevokeClassObject(DWORD dwRegister);
|
||
|
|
||
|
|
||
|
/* marshaling interface pointers */
|
||
|
|
||
|
STDAPI CoMarshalInterface(LPSTREAM pStm, REFIID riid, LPUNKNOWN pUnk,
|
||
|
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags);
|
||
|
STDAPI CoUnmarshalInterface(LPSTREAM pStm, REFIID riid, LPVOID FAR* ppv);
|
||
|
STDAPI CoMarshalHresult(LPSTREAM pstm, HRESULT hresult);
|
||
|
STDAPI CoUnmarshalHresult(LPSTREAM pstm, HRESULT FAR * phresult);
|
||
|
STDAPI CoReleaseMarshalData(LPSTREAM pStm);
|
||
|
STDAPI CoDisconnectObject(LPUNKNOWN pUnk, DWORD dwReserved);
|
||
|
STDAPI CoLockObjectExternal(LPUNKNOWN pUnk, BOOL fLock, BOOL fLastUnlockReleases);
|
||
|
STDAPI CoGetStandardMarshal(REFIID riid, LPUNKNOWN pUnk,
|
||
|
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags,
|
||
|
LPMARSHAL FAR* ppMarshal);
|
||
|
|
||
|
|
||
|
/* dll loading helpers; keeps track of ref counts and unloads all on exit */
|
||
|
|
||
|
STDAPI_(HINSTANCE) CoLoadLibrary(LPSTR lpszLibName, BOOL bAutoFree);
|
||
|
STDAPI_(void) CoFreeLibrary(HINSTANCE hInst);
|
||
|
STDAPI_(void) CoFreeAllLibraries(void);
|
||
|
STDAPI_(void) CoFreeUnusedLibraries(void);
|
||
|
|
||
|
|
||
|
/* helper for creating instances */
|
||
|
|
||
|
STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
|
||
|
DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
|
||
|
|
||
|
|
||
|
/* other helpers */
|
||
|
|
||
|
STDAPI_(BOOL) IsEqualGUID(REFGUID rguid1, REFGUID rguid2);
|
||
|
STDAPI StringFromCLSID(REFCLSID rclsid, LPSTR FAR* lplpsz);
|
||
|
STDAPI CLSIDFromString(LPSTR lpsz, LPCLSID pclsid);
|
||
|
STDAPI StringFromIID(REFIID rclsid, LPSTR FAR* lplpsz);
|
||
|
STDAPI IIDFromString(LPSTR lpsz, LPIID lpiid);
|
||
|
STDAPI_(BOOL) CoIsOle1Class(REFCLSID rclsid);
|
||
|
STDAPI ProgIDFromCLSID (REFCLSID clsid, LPSTR FAR* lplpszProgID);
|
||
|
STDAPI CLSIDFromProgID (LPCSTR lpszProgID, LPCLSID lpclsid);
|
||
|
|
||
|
|
||
|
STDAPI_(BOOL) CoFileTimeToDosDateTime(
|
||
|
FILETIME FAR* lpFileTime, LPWORD lpDosDate, LPWORD lpDosTime);
|
||
|
STDAPI_(BOOL) CoDosDateTimeToFileTime(
|
||
|
WORD nDosDate, WORD nDosTime, FILETIME FAR* lpFileTime);
|
||
|
STDAPI CoFileTimeNow( FILETIME FAR* lpFileTime );
|
||
|
|
||
|
|
||
|
STDAPI CoRegisterMessageFilter( LPMESSAGEFILTER lpMessageFilter,
|
||
|
LPMESSAGEFILTER FAR* lplpMessageFilter );
|
||
|
|
||
|
|
||
|
/* TreatAs APIS */
|
||
|
|
||
|
STDAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID pClsidNew);
|
||
|
STDAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew);
|
||
|
|
||
|
|
||
|
/* the server dlls must define their DllGetClassObject and DllCanUnloadNow
|
||
|
* to match these; the typedefs are located here to ensure all are changed at
|
||
|
* the same time.
|
||
|
*/
|
||
|
|
||
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
|
||
|
#ifdef _MAC
|
||
|
typedef STDAPICALLTYPE HRESULT (FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
|
||
|
#else
|
||
|
typedef HRESULT (STDAPICALLTYPE FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
STDAPI DllCanUnloadNow(void);
|
||
|
#ifdef _MAC
|
||
|
typedef STDAPICALLTYPE HRESULT (FAR* LPFNCANUNLOADNOW)(void);
|
||
|
#else
|
||
|
typedef HRESULT (STDAPICALLTYPE FAR* LPFNCANUNLOADNOW)(void);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/****** Debugging Helpers *************************************************/
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
// writes to the debug port and displays a message box
|
||
|
STDAPI FnAssert(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
|
||
|
#endif // _DEBUG
|
||
|
|
||
|
#endif // _COMPOBJ_H_
|