1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
/* This may look like C, but it's really -*- C++ -*- */
// @(#)objbase.h 1.4 95/09/25
// Copyright 1995 by Sun Microsystems, Inc.
//
// COM Basic Component Object Model definitions
//
// This has "enough COM" to compile (on UNIX) a recent version of the
// IIOP engine code, which more or less uses COM as a source standard.
//
// (It's unknown whether the C++ compilers on UNIX put vtables as the first
// member or not; that matters to folk writing "objects in C", relying on the
// COM ABI. In any case, the API to a pure C++ programmer is the same.)
//
// Note that Microsoft changed the header file structure so that some
// development environments now prefer "objbase.h" not "compobj.h".
//
#ifndef _compobj_h
#define _compobj_h
# if !defined(ACE_OS_H)
# error You did not include "ace/OS.h" before objbase.h. This will break on WIN32 platforms.
# endif
//
// Random data types that come from Microsoft's APIs.
//
typedef u_long ULONG;
typedef u_long HRESULT;
//
// Details of the procedure calling convention matter.
//
#define __stdcall // MS-Windows non-varargs call convention
#if defined(__cplusplus)
# define EXTERN_C extern "C"
#else
# define EXTERN_C extern
#endif
//
// IDs come built from UUIDs
// IID -- interface ID
// CLSID -- implementation ID
//
typedef char IID [16]; // XXX actually a struct
typedef const IID &REFIID;
#if !defined(INITGUID)
# define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) extern "C" const IID name
#else
# define DEFINE_GUID(name,b,c,d,e,f,g,h,i,j,k,l) extern "C" const IID name = { 0 }
#endif
//
// All objects in the "Component Object Model" (COM) inherit from
// this pure virtual base class.
//
DEFINE_GUID (IID_IUnknown, b,c,d,e,f,g,h,i,j,k,l);
class IUnknown
{
public:
virtual HRESULT __stdcall QueryInterface (REFIID riid,
void **ppv) = 0;
virtual ULONG __stdcall AddRef (void) = 0;
virtual ULONG __stdcall Release (void) = 0;
};
// XXX haven't looked closely at COM's fault reporting yet ...
typedef u_long SCODE;
inline HRESULT ResultFromScode(SCODE scode) { return scode; }
#define NOERROR ((SCODE) 0)
#define E_NOINTERFACE ((SCODE) 17)
// VARIANT is OLE's extremely limited version of "Any". There are
// numerous definitions of this type in different MS environments;
// this one's the Win32 version. We need it here because part of the
// CORBA-COM mapping is conversions between Any and VARIANT.
//
// XXX not all of these types are worth trying to support portably,
// and even those that are worth supporting portably aren't fully
// supported at this writing.
typedef u_short VARTYPE;
enum VARENUM
{ // only types suitable for VARIANTs
VT_EMPTY = 0, // nothing
VT_NULL = 1, // SQL style ull (XXX)
VT_I2 = 2, // signed 2 byte integer
VT_I4 = 3, // signed 4 byte integer
VT_R4 = 4, // IEEE "single" floating point
VT_R8 = 5, // IEEE "double" floating point
VT_CY = 6, // currency
VT_DATE = 7, // date
VT_BSTR = 8, // counted string
VT_DISPATCH = 9, // IDispatch COM object
VT_ERROR = 10, // SCODE
VT_BOOL = 11, // true=1, false=0
VT_VARIANT = 12, // variant pointer
VT_UNKNOWN = 13, // IUnknown COM object
VT_UI1 = 17, // octet
VT_ARRAY = 0x2000, // SAFEARRAY * of more primitive type
VT_BYREF = 0x4000 // pointer to more primitive type
};
struct CY
// = TITLE
// Currency is an eight byte fixed point number (could be "long long").
{
#if defined (WORDS_BIGENDIAN)
long Hi;
u_long Lo;
#else
u_long Lo;
long Hi;
#endif /* WORDS_BIGENDIAN */
};
// DATE format is days since 30-Dec-1889 ... days in the "whole"
// part, time in the fractional part (part of a day).
typedef double DATE;
struct VARIANT
{
VARTYPE vt; // type ID
u_short wReserved1, wReserved2, wReserved3;
union
{
//
// By-Value fields
//
long lVal; // VT_I4
u_char bVal; // VT_UI1
short iVal; // VT_I2
float fltVal; // VT_R4
double dblVal; // VT_R8
// VARIANT_BOOL bool; // VT_BOOL
SCODE scode; // VT_ERROR
CY cyVal; // VT_CY
DATE date; // VT_DATE
// BSTR bstrVal; // VT_BSTR
IUnknown *punkVal; // VT_UNKNOWN
// IDispatch *pdispVal; // VT_DISPATCH
// SAFEARRAY *parray; // VT_ARRAY
//
// By-Reference fields (for VARIANTARG)
//
u_char *pbVal; // VT_BYREF|VT_UI1
short *piVal; // VT_BYREF|VT_I2
long *plVal; // VT_BYREF|VT_I4
float *pfltVal; // VT_BYREF|VT_R4
double *pdblVal; // VT_BYREF|VT_R8
// VARIANT_BOOL *pbool; // VT_BYREF|VT_BOOL
SCODE *pscode; // VT_BYREF|VT_ERROR
CY *pcyVal; // VT_BYREF|VT_CY
DATE *pdate; // VT_BYREF|VT_DATE
// BSTR *pbstrVal; // VT_BYREF|VT_BSTR
IUnknown **ppunkVal; // VT_BYREF|VT_UNKNOWN
// IDispatch **ppdisVal; // VT_BYREF|VT_DISPATCH
// SAFEARRAY *pparray; // VT_BYREF|VT_ARRAY
VARIANT *pvarVal; // VT_BYREF|VT_VARIANT
void *byref; // generic VT_BYREF
};
};
#endif // _compobj_h
|