ReactOS 0.4.16-dev-1946-g52006dd
typelib.c
Go to the documentation of this file.
1/*
2 * IDL Compiler
3 *
4 * Copyright 2004 Ove Kaaven
5 * Copyright 2006 Jacek Caban for CodeWeavers
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "config.h"
23
24#include <stdio.h>
25#include <stdlib.h>
26#include <stdarg.h>
27#include <string.h>
28#include <ctype.h>
29
30#include "widl.h"
31#ifdef __REACTOS__
32#include <typedefs.h>
33#include <pecoff.h>
34#else
35#include "windef.h"
36#include "winbase.h"
37#endif
38#include "utils.h"
39#include "wpp_private.h"
40#include "parser.h"
41#include "header.h"
42#include "typelib.h"
43#include "widltypes.h"
44#include "typelib_struct.h"
45#include "typetree.h"
46
47#ifdef __REACTOS__
48static typelib_t *typelib;
49#endif
50
51/* List of oleauto types that should be recognized by name.
52 * (most of) these seem to be intrinsic types in mktyplib.
53 * This table MUST be alphabetically sorted on the kw field.
54 */
55static const struct oatype {
56 const char *kw;
57 unsigned short vt;
58} oatypes[] = {
59 {"BSTR", VT_BSTR},
60 {"CURRENCY", VT_CY},
61 {"DATE", VT_DATE},
62 {"DECIMAL", VT_DECIMAL},
63 {"HRESULT", VT_HRESULT},
64 {"LPSTR", VT_LPSTR},
65 {"LPWSTR", VT_LPWSTR},
66 {"SCODE", VT_ERROR},
67 {"VARIANT", VT_VARIANT},
68 {"VARIANT_BOOL", VT_BOOL}
69};
70#define KWP(p) ((const struct oatype *)(p))
71
72static int kw_cmp_func(const void *s1, const void *s2)
73{
74 return strcmp(KWP(s1)->kw, KWP(s2)->kw);
75}
76
77static unsigned short builtin_vt(const type_t *t)
78{
79 const char *kw = t->name;
80 struct oatype key;
81 const struct oatype *kwp;
82 key.kw = kw;
83#ifdef KW_BSEARCH
84 kwp = bsearch(&key, oatypes, ARRAY_SIZE(oatypes), sizeof(oatypes[0]), kw_cmp_func);
85#else
86 {
87 unsigned int i;
88 for (kwp = NULL, i = 0; i < ARRAY_SIZE(oatypes); i++)
89 if (!kw_cmp_func(&key, &oatypes[i])) {
90 kwp = &oatypes[i];
91 break;
92 }
93 }
94#endif
95 if (kwp) {
96 return kwp->vt;
97 }
98 if (is_string_type (t->attrs, t))
99 {
100 const type_t *elem_type;
101 if (is_array(t))
102 elem_type = type_array_get_element_type(t);
103 else
104 elem_type = type_pointer_get_ref_type(t);
105 if (type_get_type(elem_type) == TYPE_BASIC)
106 {
107 switch (type_basic_get_type(elem_type))
108 {
109 case TYPE_BASIC_CHAR: return VT_LPSTR;
110 case TYPE_BASIC_WCHAR: return VT_LPWSTR;
111 default: break;
112 }
113 }
114 }
115 return 0;
116}
117
118static int match(const char*n, const char*m)
119{
120 if (!n) return 0;
121 return !strcmp(n, m);
122}
123
124unsigned short get_type_vt(type_t *t)
125{
126 unsigned short vt;
127
128 chat("get_type_vt: %p type->name %s\n", t, t->name);
129 if (t->name) {
130 vt = builtin_vt(t);
131 if (vt) return vt;
132 }
133
134 if (type_is_alias(t) &&
135 (is_attr(t->attrs, ATTR_PUBLIC) || is_attr(t->attrs, ATTR_WIREMARSHAL)))
136 return VT_USERDEFINED;
137
138 switch (type_get_type(t)) {
139 case TYPE_BASIC:
140 switch (type_basic_get_type(t)) {
141 case TYPE_BASIC_BYTE:
142 return VT_UI1;
143 case TYPE_BASIC_CHAR:
144 case TYPE_BASIC_INT8:
145 if (type_basic_get_sign(t) > 0)
146 return VT_UI1;
147 else
148 return VT_I1;
149 case TYPE_BASIC_WCHAR:
150 return VT_I2; /* mktyplib seems to parse wchar_t as short */
151 case TYPE_BASIC_INT16:
152 if (type_basic_get_sign(t) > 0)
153 return VT_UI2;
154 else
155 return VT_I2;
156 case TYPE_BASIC_INT:
157 if (type_basic_get_sign(t) > 0)
158 return VT_UINT;
159 else
160 return VT_INT;
161 case TYPE_BASIC_INT32:
162 case TYPE_BASIC_LONG:
164 if (type_basic_get_sign(t) > 0)
165 return VT_UI4;
166 else
167 return VT_I4;
168 case TYPE_BASIC_INT64:
169 case TYPE_BASIC_HYPER:
170 if (type_basic_get_sign(t) > 0)
171 return VT_UI8;
172 else
173 return VT_I8;
175 if (pointer_size == 8)
176 {
177 if (type_basic_get_sign(t) > 0)
178 return VT_UI8;
179 else
180 return VT_I8;
181 }
182 else
183 {
184 if (type_basic_get_sign(t) > 0)
185 return VT_UI4;
186 else
187 return VT_I4;
188 }
189 case TYPE_BASIC_FLOAT:
190 return VT_R4;
192 return VT_R8;
194 error("handles can't be used in typelibs\n");
195 }
196 break;
197
198 case TYPE_POINTER:
199 return VT_PTR;
200
201 case TYPE_ARRAY:
203 {
204 if (match(type_array_get_element_type(t)->name, "SAFEARRAY"))
205 return VT_SAFEARRAY;
206 return VT_PTR;
207 }
208 else
209 return VT_CARRAY;
210
211 case TYPE_INTERFACE:
212 if(match(t->name, "IUnknown"))
213 return VT_UNKNOWN;
214 if(match(t->name, "IDispatch"))
215 return VT_DISPATCH;
216 return VT_USERDEFINED;
217
218 case TYPE_ENUM:
219 case TYPE_STRUCT:
220 case TYPE_COCLASS:
221 case TYPE_MODULE:
222 case TYPE_UNION:
225 case TYPE_DELEGATE:
226 return VT_USERDEFINED;
227
228 case TYPE_VOID:
229 return VT_VOID;
230
231 case TYPE_ALIAS:
232 case TYPE_APICONTRACT:
234 case TYPE_PARAMETER:
235 /* not supposed to be here */
236 assert(0);
237 break;
238
239 case TYPE_FUNCTION:
240 error("get_type_vt: functions not supported\n");
241 break;
242
243 case TYPE_BITFIELD:
244 error("get_type_vt: bitfields not supported\n");
245 break;
246 }
247 return 0;
248}
249
250#ifdef __REACTOS__
251void start_typelib(typelib_t *typelib_type)
252{
253 if (!do_typelib) return;
254 typelib = typelib_type;
255}
256
257void end_typelib(void)
258{
259 if (!typelib) return;
260
262}
263#endif
264
265static void msft_read_guid(void *data, MSFT_SegDir *segdir, int offset, struct uuid *guid)
266{
267 memcpy( guid, (char *)data + segdir->pGuidTab.offset + offset, sizeof(*guid) );
268}
269
270static void read_msft_importlib(importlib_t *importlib, void *data, unsigned int size)
271{
273 MSFT_SegDir *segdir;
274 int *typeinfo_offs;
275 int i;
276
277 importlib->allocated = 0;
278 importlib->version = header->version;
279
280 typeinfo_offs = (int *)(header + 1);
281 segdir = (MSFT_SegDir *)(typeinfo_offs + header->nrtypeinfos);
282
283 msft_read_guid(data, segdir, header->posguid, &importlib->guid);
284
285 importlib->ntypeinfos = header->nrtypeinfos;
286 importlib->importinfos = xmalloc(importlib->ntypeinfos*sizeof(importinfo_t));
287
288 for(i=0; i < importlib->ntypeinfos; i++) {
289 MSFT_TypeInfoBase *base = (MSFT_TypeInfoBase *)((char *)(segdir + 1) + typeinfo_offs[i]);
290 MSFT_NameIntro *nameintro;
291 int len;
292
293 importlib->importinfos[i].importlib = importlib;
294 importlib->importinfos[i].flags = (base->typekind & 0xf)<<24;
295 importlib->importinfos[i].offset = -1;
296 importlib->importinfos[i].id = i;
297
298 if(base->posguid != -1) {
299 importlib->importinfos[i].flags |= MSFT_IMPINFO_OFFSET_IS_GUID;
300 msft_read_guid(data, segdir, base->posguid, &importlib->importinfos[i].guid);
301 }
302 else memset( &importlib->importinfos[i].guid, 0, sizeof(importlib->importinfos[i].guid));
303
304 nameintro = (MSFT_NameIntro *)((char *)data + segdir->pNametab.offset + base->NameOffset);
305
306 len = nameintro->namelen & 0xff;
307 importlib->importinfos[i].name = xmalloc(len+1);
308 memcpy( importlib->importinfos[i].name, nameintro + 1, len );
309 importlib->importinfos[i].name[len] = 0;
310 }
311}
312
313static unsigned int rva_to_va( const IMAGE_NT_HEADERS32 *nt, unsigned int rva )
314{
316 unsigned int i;
317
318 for (i = 0; i < nt->FileHeader.NumberOfSections; i++, sec++)
319 if (sec->VirtualAddress <= rva && sec->VirtualAddress + sec->Misc.VirtualSize > rva)
320 return sec->PointerToRawData + (rva - sec->VirtualAddress);
321 error( "no PE section found for addr %x\n", rva );
322#ifdef __REACTOS__
323 return 0;
324#endif
325}
326
327static void read_pe_importlib(importlib_t *importlib, void *data, unsigned int size)
328{
335 void *ptr;
336 unsigned int i, va;
337
338 if (dos->e_lfanew < sizeof(*dos) || dos->e_lfanew >= size) error( "not a PE file\n" );
339 nt = (IMAGE_NT_HEADERS32 *)((char *)data + dos->e_lfanew);
340 if (nt->Signature != IMAGE_NT_SIGNATURE) error( "not a PE file\n" );
341 if ((char *)(IMAGE_FIRST_SECTION(nt) + nt->FileHeader.NumberOfSections) > (char *)data + size)
342 error( "invalid PE file\n" );
343 switch (nt->OptionalHeader.Magic)
344 {
347 break;
349 dir = &((IMAGE_NT_HEADERS64 *)nt)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
350 break;
351 default:
352 error( "invalid PE file\n" );
353 }
354 if (!dir->VirtualAddress || !dir->Size) error( "resource not found in PE file\n" );
355 va = rva_to_va( nt, dir->VirtualAddress );
356 if (va + dir->Size > size) error( "invalid resource data in PE file\n" );
357 root = resdir = (IMAGE_RESOURCE_DIRECTORY *)((char *)data + va );
358 entry = (IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
359 for (i = 0; i < resdir->NumberOfNamedEntries; i++, entry++)
360 {
361 static const WCHAR typelibW[] = {'T','Y','P','E','L','I','B'};
362 WCHAR *name = (WCHAR *)((char *)root + entry->NameOffset);
363 if (name[0] != ARRAY_SIZE(typelibW)) continue;
364 if (!memcmp( name + 1, typelibW, sizeof(typelibW) )) break;
365 }
366 if (i == resdir->NumberOfNamedEntries) error( "typelib resource not found in PE file\n" );
367 while (entry->DataIsDirectory)
368 {
369 resdir = (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry->OffsetToDirectory);
370 entry = (IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
371 }
372 resdata = (IMAGE_RESOURCE_DATA_ENTRY *)((char *)root + entry->OffsetToData);
373 ptr = (char *)data + rva_to_va( nt, resdata->OffsetToData );
374 if (memcmp( ptr, "MSFT", 4 )) error( "invalid typelib found in PE file\n" );
375 read_msft_importlib( importlib, ptr, resdata->Size );
376}
377
378static void read_importlib(importlib_t *importlib)
379{
380 int fd, size;
381 void *data;
382
383 fd = open_typelib(importlib->name);
384
385 /* widl extension: if importlib name has no .tlb extension, try using .tlb */
386 if (fd < 0 && !strendswith( importlib->name, ".tlb" ))
387 fd = open_typelib( strmake( "%s.tlb", importlib->name ));
388
389 if(fd < 0)
390 error("Could not find importlib %s.\n", importlib->name);
391
392 size = lseek( fd, 0, SEEK_END );
393 data = xmalloc( size );
394 lseek( fd, 0, SEEK_SET );
395 if (read( fd, data, size) < size) error("error while reading importlib.\n");
396 close( fd );
397
398 if (!memcmp( data, "MSFT", 4 ))
399 read_msft_importlib(importlib, data, size);
400 else if (!memcmp( data, "MZ", 2 ))
401 read_pe_importlib(importlib, data, size);
402 else
403 error("Wrong or unsupported typelib\n");
404
405 free( data );
406}
407
408#ifdef __REACTOS__
409void add_importlib(const char *name)
410#else
412#endif
413{
414 importlib_t *importlib;
415
416 if(!typelib) return;
417
418 LIST_FOR_EACH_ENTRY( importlib, &typelib->importlibs, importlib_t, entry )
419 if(!strcmp(name, importlib->name))
420 return;
421
422 chat("add_importlib: %s\n", name);
423
424 importlib = xmalloc(sizeof(*importlib));
425 memset( importlib, 0, sizeof(*importlib) );
426 importlib->name = xstrdup(name);
427
428 read_importlib(importlib);
429 list_add_head( &typelib->importlibs, &importlib->entry );
430}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define read
Definition: acwin.h:96
#define close
Definition: acwin.h:98
unsigned int dir
Definition: maze.c:112
char * xstrdup(const char *s)
Definition: uimain.c:768
void * xmalloc(int size)
Definition: uimain.c:747
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
struct _root root
#define SEEK_END
Definition: cabinet.c:29
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_VOID
Definition: compat.h:2318
@ VT_INT
Definition: compat.h:2316
@ VT_LPSTR
Definition: compat.h:2324
@ VT_R4
Definition: compat.h:2299
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_PTR
Definition: compat.h:2320
@ VT_UI2
Definition: compat.h:2312
@ VT_DECIMAL
Definition: compat.h:2309
@ VT_ERROR
Definition: compat.h:2305
@ VT_SAFEARRAY
Definition: compat.h:2321
@ VT_LPWSTR
Definition: compat.h:2325
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_USERDEFINED
Definition: compat.h:2323
@ VT_HRESULT
Definition: compat.h:2319
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_CARRAY
Definition: compat.h:2322
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
GUID guid
Definition: version.c:147
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
#define MSFT_IMPINFO_OFFSET_IS_GUID
Definition: typelib.h:174
#define assert(x)
Definition: debug.h:53
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLsizei len
Definition: glext.h:6722
const GLfloat * m
Definition: glext.h:10848
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
Definition: msctf.idl:532
uint32_t entry
Definition: isohybrid.c:63
#define SEEK_SET
Definition: jmemansi.c:26
#define lseek
Definition: syshdrs.h:47
struct S1 s1
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
IMAGE_NT_HEADERS nt
Definition: module.c:50
IMAGE_DOS_HEADER dos
Definition: module.c:49
char * strmake(size_t *lenp,...)
Definition: util.c:82
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC
Definition: ntimage.h:376
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC
Definition: ntimage.h:377
#define IMAGE_FIRST_SECTION(NtHeader)
Definition: ntimage.h:427
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define IMAGE_DIRECTORY_ENTRY_RESOURCE
Definition: pedump.c:261
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
static int fd
Definition: io.c:51
#define memset(x, y, z)
Definition: compat.h:39
static const WCHAR typelibW[]
Definition: actctx.c:640
static int strendswith(const char *str, const char *end)
Definition: tools.h:145
int is_attr(const attr_list_t *list, enum attr_type attr_type)
Definition: attribute.c:45
static int is_string_type(const attr_list_t *attrs, const type_t *type)
Definition: header.h:95
static int is_array(const type_t *t)
Definition: header.h:60
static void msft_read_guid(void *data, MSFT_SegDir *segdir, int offset, struct uuid *guid)
Definition: typelib.c:265
static int kw_cmp_func(const void *s1, const void *s2)
Definition: typelib.c:72
static void read_pe_importlib(importlib_t *importlib, void *data, unsigned int size)
Definition: typelib.c:327
static const struct oatype oatypes[]
static unsigned int rva_to_va(const IMAGE_NT_HEADERS32 *nt, unsigned int rva)
Definition: typelib.c:313
void add_importlib(const char *name, typelib_t *typelib)
Definition: typelib.c:411
unsigned short get_type_vt(type_t *t)
Definition: typelib.c:124
static unsigned short builtin_vt(const type_t *t)
Definition: typelib.c:77
static void read_importlib(importlib_t *importlib)
Definition: typelib.c:378
#define KWP(p)
Definition: typelib.c:70
static void read_msft_importlib(importlib_t *importlib, void *data, unsigned int size)
Definition: typelib.c:270
int create_msft_typelib(typelib_t *typelib)
Definition: write_msft.c:2755
void chat(const char *s,...)
Definition: utils.c:79
PCWSTR s2
Definition: shell32_main.h:38
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_FILE_HEADER FileHeader
Definition: ntddk_ex.h:183
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
Definition: pedump.c:458
DWORD OffsetToData
Definition: pedump.c:459
DWORD Size
Definition: pedump.c:460
Definition: pedump.c:414
union _IMAGE_SECTION_HEADER::@1686 Misc
DWORD PointerToRawData
Definition: pedump.c:290
Definition: copy.c:22
Definition: match.c:28
Definition: name.c:39
Definition: typelib.c:55
unsigned short vt
Definition: typelib.c:57
const char * kw
Definition: typelib.c:56
MSFT_pSeg pNametab
Definition: typelib.h:109
MSFT_pSeg pGuidTab
Definition: typelib.h:105
INT offset
Definition: typelib.h:89
#define bsearch
static int type_array_is_decl_as_ptr(const type_t *type)
Definition: typetree.h:350
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:113
static int type_basic_get_sign(const type_t *type)
Definition: typetree.h:125
static type_t * type_array_get_element_type(const type_t *type)
Definition: typetree.h:345
static enum type_basic_type type_basic_get_type(const type_t *type)
Definition: typetree.h:118
static type_t * type_pointer_get_ref_type(const type_t *type)
Definition: typetree.h:424
static int type_is_alias(const type_t *type)
Definition: typetree.h:357
unsigned int pointer_size
Definition: widl.c:147
int do_typelib
Definition: widl.c:101
int open_typelib(const char *name)
Definition: widl.c:650
@ TYPE_PARAMETER
Definition: widltypes.h:495
@ TYPE_ENUM
Definition: widltypes.h:480
@ TYPE_BITFIELD
Definition: widltypes.h:491
@ TYPE_BASIC
Definition: widltypes.h:479
@ TYPE_UNION
Definition: widltypes.h:483
@ TYPE_ALIAS
Definition: widltypes.h:484
@ TYPE_PARAMETERIZED_TYPE
Definition: widltypes.h:494
@ TYPE_POINTER
Definition: widltypes.h:489
@ TYPE_VOID
Definition: widltypes.h:478
@ TYPE_ENCAPSULATED_UNION
Definition: widltypes.h:482
@ TYPE_COCLASS
Definition: widltypes.h:486
@ TYPE_STRUCT
Definition: widltypes.h:481
@ TYPE_MODULE
Definition: widltypes.h:485
@ TYPE_DELEGATE
Definition: widltypes.h:496
@ TYPE_RUNTIMECLASS
Definition: widltypes.h:493
@ TYPE_INTERFACE
Definition: widltypes.h:488
@ TYPE_ARRAY
Definition: widltypes.h:490
@ TYPE_FUNCTION
Definition: widltypes.h:487
@ TYPE_APICONTRACT
Definition: widltypes.h:492
@ ATTR_PUBLIC
Definition: widltypes.h:163
@ ATTR_WIREMARSHAL
Definition: widltypes.h:187
@ TYPE_BASIC_DOUBLE
Definition: widltypes.h:308
@ TYPE_BASIC_INT32
Definition: widltypes.h:298
@ TYPE_BASIC_ERROR_STATUS_T
Definition: widltypes.h:309
@ TYPE_BASIC_CHAR
Definition: widltypes.h:303
@ TYPE_BASIC_WCHAR
Definition: widltypes.h:306
@ TYPE_BASIC_INT16
Definition: widltypes.h:297
@ TYPE_BASIC_HYPER
Definition: widltypes.h:304
@ TYPE_BASIC_HANDLE
Definition: widltypes.h:310
@ TYPE_BASIC_INT8
Definition: widltypes.h:296
@ TYPE_BASIC_INT3264
Definition: widltypes.h:301
@ TYPE_BASIC_LONG
Definition: widltypes.h:302
@ TYPE_BASIC_INT64
Definition: widltypes.h:299
@ TYPE_BASIC_BYTE
Definition: widltypes.h:305
@ TYPE_BASIC_INT
Definition: widltypes.h:300
@ TYPE_BASIC_FLOAT
Definition: widltypes.h:307
__wchar_t WCHAR
Definition: xmlstorage.h:180