Implemented support for arrays and safe arrays in VARIANT data
[wine] / include / wine / obj_oleaut.h
1 /*
2  * Defines the COM interfaces and APIs related to OLE automation support.
3  *
4  * Depends on 'obj_base.h'.
5  */
6
7 #ifndef __WINE_WINE_OBJ_OLEAUT_H
8 #define __WINE_WINE_OBJ_OLEAUT_H
9
10 #include "windows.h"
11 #include "wintypes.h"
12
13 /*****************************************************************************
14  * Predeclare the interfaces
15  */
16 DEFINE_OLEGUID(IID_IDispatch,       0x00020400,0,0);
17 typedef struct IDispatch IDispatch,*LPDISPATCH;
18
19 DEFINE_OLEGUID(IID_ITypeInfo,       0x00020401,0,0);
20 typedef struct ITypeInfo ITypeInfo,*LPTYPEINFO;
21
22 DEFINE_OLEGUID(IID_ITypeLib,        0x00020402,0,0);
23 typedef struct ITypeLib ITypeLib,*LPTYPELIB;
24
25 DEFINE_OLEGUID(IID_ITypeComp,       0x00020403,0,0);
26 typedef struct ITypeComp ITypeComp,*LPTYPECOMP;
27
28 DEFINE_OLEGUID(IID_IEnumVariant,    0x00020404,0,0);
29 typedef struct IenumVariant IEnumVariant,*LPENUMVARIANT;
30
31 DEFINE_OLEGUID(IID_ICreateTypeInfo, 0x00020405,0,0);
32 typedef struct ICreateTypeInfo ICreateTypeInfo,*LPCREATETYPEINFO;
33
34 DEFINE_OLEGUID(IID_ICreateTypeLib,  0x00020406,0,0);
35 typedef struct ICreateTypeLib ICreateTypeLib,*LPCREATETYPELIB;
36
37 DEFINE_OLEGUID(IID_ICreateTypeInfo2,0x0002040E,0,0);
38 typedef struct ICreateTypeInfo2 ICreateTypeInfo2,*LPCREATETYPEINFO2;
39
40 DEFINE_OLEGUID(IID_ICreateTypeLib2, 0x0002040F,0,0);
41 typedef struct ICreateTypeLib2 ICreateTypeLib2,*LPCREATETYPELIB2;
42
43 DEFINE_OLEGUID(IID_ITypeChangeEvents,0x00020410,0,0);
44 typedef struct ITypeChangeEvents ITypeChangeEvents,*LPTYPECHANGEEVENTS;
45
46 DEFINE_OLEGUID(IID_ITypeLib2,       0x00020411,0,0);
47 typedef struct ITypeLib2 ITypeLib2,*LPTYPELIB2;
48
49 DEFINE_OLEGUID(IID_ITypeInfo2,      0x00020412,0,0);
50 typedef struct ITypeInfo2 ITypeInfo2,*LPTYPEINFO2;
51
52 DEFINE_GUID(IID_IErrorInfo,         0x1CF2B120,0x547D,0x101B,0x8E,0x65,
53         0x08,0x00, 0x2B,0x2B,0xD1,0x19);
54 typedef struct IErrorInfo IErrorInfo,*LPERRORINFO;
55
56 DEFINE_GUID(IID_ICreateErrorInfo,   0x22F03340,0x547D,0x101B,0x8E,0x65,
57         0x08,0x00, 0x2B,0x2B,0xD1,0x19);
58 typedef struct ICreateErrorInfo ICreateErrorInfo,*LPCREATEERRORINFO;
59
60 DEFINE_GUID(IID_ISupportErrorInfo,  0xDF0B3D60,0x547D,0x101B,0x8E,0x65,
61         0x08,0x00, 0x2B,0x2B,0xD1,0x19);
62 typedef struct ISupportErrorInfo ISupportErrorInfo,*LPSUPPORTERRORINFO;
63
64 /*****************************************************************************
65  * Automation data types
66  */
67
68 /*****************************************************************
69  *  SafeArray defines and structs 
70  */
71
72 #define FADF_AUTO       ( 0x1 )
73 #define FADF_STATIC     ( 0x2 )
74 #define FADF_EMBEDDED   ( 0x4 )
75 #define FADF_FIXEDSIZE  ( 0x10 )
76 #define FADF_BSTR       ( 0x100 )
77 #define FADF_UNKNOWN    ( 0x200 )
78 #define FADF_DISPATCH   ( 0x400 )
79 #define FADF_VARIANT    ( 0x800 )
80 #define FADF_RESERVED   ( 0xf0e8 )
81
82 typedef struct  tagSAFEARRAYBOUND 
83 {
84   ULONG cElements;                  /* Number of elements in dimension */
85   LONG  lLbound;                    /* Lower bound of dimension */
86 } SAFEARRAYBOUND;
87
88 typedef struct  tagSAFEARRAY
89
90   USHORT          cDims;            /* Count of array dimension */
91   USHORT          fFeatures;        /* Flags describing the array */
92   ULONG           cbElements;       /* Size of each element */
93   ULONG           cLocks;           /* Number of lock on array */
94   PVOID           pvData;           /* Pointer to data valid when cLocks > 0 */
95   SAFEARRAYBOUND  rgsabound[ 1 ];   /* One bound for each dimension */
96 } SAFEARRAY, *LPSAFEARRAY;
97
98
99 /*
100  * Data types for Variants.
101  */
102
103 enum VARENUM {
104         VT_EMPTY = 0,
105         VT_NULL = 1,
106         VT_I2 = 2,
107         VT_I4 = 3,
108         VT_R4 = 4,
109         VT_R8 = 5,
110         VT_CY = 6,
111         VT_DATE = 7,
112         VT_BSTR = 8,
113         VT_DISPATCH = 9,
114         VT_ERROR  = 10,
115         VT_BOOL = 11,
116         VT_VARIANT      = 12,
117         VT_UNKNOWN      = 13,
118         VT_DECIMAL      = 14,
119         VT_I1 = 16,
120         VT_UI1  = 17,
121         VT_UI2  = 18,
122         VT_UI4  = 19,
123         VT_I8 = 20,
124         VT_UI8  = 21,
125         VT_INT  = 22,
126         VT_UINT = 23,
127         VT_VOID = 24,
128         VT_HRESULT      = 25,
129         VT_PTR  = 26,
130         VT_SAFEARRAY  = 27,
131         VT_CARRAY = 28,
132         VT_USERDEFINED  = 29,
133         VT_LPSTR  = 30,
134         VT_LPWSTR = 31,
135         VT_FILETIME = 64,
136         VT_BLOB = 65,
137         VT_STREAM = 66,
138         VT_STORAGE      = 67,
139         VT_STREAMED_OBJECT      = 68,
140         VT_STORED_OBJECT  = 69,
141         VT_BLOB_OBJECT  = 70,
142         VT_CF = 71,
143         VT_CLSID  = 72,
144         VT_VECTOR = 0x1000,
145         VT_ARRAY  = 0x2000,
146         VT_BYREF  = 0x4000,
147         VT_RESERVED = 0x8000,
148         VT_ILLEGAL      = 0xffff,
149         VT_ILLEGALMASKED  = 0xfff,
150         VT_TYPEMASK = 0xfff
151 };
152
153 /* the largest valide type
154  */
155 #define VT_MAXVALIDTYPE VT_CLSID
156
157
158 /*
159  * Declarations of the VARIANT structure and the VARIANT APIs.
160  */
161
162 /* S_OK                            : Success.
163  * DISP_E_BADVARTYPE   : The variant type vt in not a valid type of variant.
164  * DISP_E_OVERFLOW         : The data pointed to by pvarSrc does not fit in the destination type.
165  * DISP_E_TYPEMISMATCH : The variant type vt is not a valid type of variant.
166  * E_INVALIDARG            : One argument is invalid.
167  * E_OUTOFMEMORY           : Memory could not be allocated for the conversion.
168  * DISP_E_ARRAYISLOCKED : The variant contains an array that is locked.
169  */
170
171 #ifdef __cplusplus
172 #define _wine_tagVARIANT_UNION_NAME 
173 #else
174 #define _wine_tagVARIANT_UNION_NAME u
175 #endif
176 /* end FIXME */
177
178 typedef struct tagVARIANT VARIANT, *LPVARIANT;
179 typedef struct tagVARIANT VARIANTARG, *LPVARIANTARG;
180
181 struct tagVARIANT {
182         VARTYPE vt;
183         WORD wReserved1;
184         WORD wReserved2;
185         WORD wReserved3;
186   union _wine_tagVARIANT_UNION_NAME 
187         {
188                 /* By value.
189                  */
190                 CHAR cVal;
191                 USHORT uiVal;
192                 ULONG ulVal;
193                 INT intVal;
194                 UINT uintVal;
195                 BYTE bVal;
196                 short iVal;
197                 long lVal;
198                 float fltVal;
199                 double dblVal;
200                 VARIANT_BOOL boolVal;
201                 SCODE scode;
202                 DATE date;
203                 BSTR bstrVal;
204                 CY cyVal;
205         /*
206         DECIMAL decVal;
207                 IUnknown* punkVal;
208                 IDispatch* pdispVal;
209         */
210                 SAFEARRAY* parray;
211
212                 /* By reference
213                  */
214                 CHAR* pcVal;
215                 USHORT* puiVal;
216                 ULONG* pulVal;
217                 INT* pintVal;
218                 UINT* puintVal;
219                 BYTE* pbVal;
220                 short* piVal;
221                 long* plVal;
222                 float* pfltVal;
223                 double* pdblVal;
224                 VARIANT_BOOL* pboolVal;
225                 SCODE* pscode;
226                 DATE* pdate;
227                 BSTR* pbstrVal;
228                 VARIANT* pvarVal;
229                 PVOID byref;
230                 CY* pcyVal;
231         /*
232         DECIMAL* pdecVal;
233                 IUnknown** ppunkVal;
234                 IDispatch** ppdispVal;
235         */
236                 SAFEARRAY** pparray;
237   } _wine_tagVARIANT_UNION_NAME;
238 };
239
240 typedef LONG DISPID;
241
242 typedef struct  tagDISPPARAMS
243 {
244   VARIANTARG* rgvarg;
245   DISPID*     rgdispidNamedArgs;
246   UINT      cArgs;
247   UINT      cNamedArgs;
248 } DISPPARAMS;
249
250 typedef struct tagEXCEPINFO {
251     WORD  wCode;
252     WORD  wReserved;
253     BSTR  bstrSource;
254     BSTR  bstrDescription;
255     BSTR  bstrHelpFile;
256     DWORD dwHelpContext;
257     PVOID pvReserved;
258     HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
259     SCODE scode;
260 } EXCEPINFO, * LPEXCEPINFO;
261
262 /*****************************************************************************
263  * IDispatch interface
264  */
265 #define ICOM_INTERFACE IDispatch
266 #define IDispatch_METHODS \
267   ICOM_METHOD1(HRESULT, GetTypeInfoCount, UINT*, pctinfo); \
268   ICOM_METHOD3(HRESULT, GetTypeInfo, UINT, iTInfo, LCID, lcid, ITypeInfo**, ppTInfo); \
269   ICOM_METHOD5(HRESULT, GetIDsOfNames, REFIID, riid, LPOLESTR*, rgszNames, UINT, cNames, LCID, lcid, DISPID*, rgDispId); \
270   ICOM_METHOD8(HRESULT, Invoke, DISPID, dispIdMember, REFIID, riid, LCID, lcid, WORD, wFlags, DISPPARAMS*, pDispParams, VARIANT*, pVarResult, EXCEPINFO*, pExepInfo, UINT*, puArgErr); 
271 #define IDispatch_IMETHODS \
272   ICOM_INHERITS(IDispatch,IUnknown)
273 ICOM_DEFINE(IDispatch,IUnknown)
274 #undef ICOM_INTERFACE
275
276 #ifdef ICOM_CINTERFACE
277 /*** IUnknown methods ***/
278 #define IDispatch_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
279 #define IDispatch_AddRef(p)             ICOM_CALL (AddRef,p)
280 #define IDispatch_Release(p)            ICOM_CALL (Release,p)
281 /*** IDispatch methods ***/
282 #define IDispatch_GetTypeInfoCount(p,a)      ICOM_CALL1 (GetTypeInfoCount,p,a)
283 #define IDispatch_GetTypeInfo(p,a,b,c)       ICOM_CALL3 (GetTypeInfo,p,b,c)
284 #define IDispatch_GetIDsOfNames(p,a,b,c,d,e) ICOM_CALL5 (GetIDsOfNames,p,a,b,c,d,e)
285 #define IDispatch_Invoke(p,a,b,c,d,e,f,g,h)  ICOM_CALL8 (Invoke,p,a,b,c,d,e,f,g,h)
286 #endif
287
288
289 #endif /* __WINE_WINE_OBJ_OLEAUT_H */
290