9617f2d5b129915d168005dbdd0d3b6ff2ada166
[reactos.git] / reactos / tools / widl / typelib_struct.h
1 /*
2 * typelib_struct.h internal wine data structures
3 * used to decode typelib's
4 *
5 * Copyright 1999 Rein KLazes
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21 #ifndef _WIDL_TYPELIB_STRUCT_H
22 #define _WIDL_TYPELIB_STRUCT_H
23
24 #define HELPDLLFLAG (0x0100)
25 #define DO_NOT_SEEK (-1)
26
27 #define MSFT_HREFTYPE_INTHISFILE(href) (!((href) & 3))
28 #define MSFT_HREFTYPE_INDEX(href) ((href) /sizeof(MSFT_TypeInfoBase))
29
30 /*-------------------------FILE STRUCTURES-----------------------------------*/
31
32 /* There are two known file formats, those created with ICreateTypeLib
33 * have the signature "SLTG" as their first four bytes, while those created
34 * with ICreateTypeLib2 have "MSFT".
35 */
36
37 /*****************************************************
38 * MSFT typelibs
39 *
40 * These are TypeLibs created with ICreateTypeLib2
41 *
42 */
43
44 /*
45 * structure of the typelib type2 header
46 * it is at the beginning of a type lib file
47 *
48 */
49 typedef struct tagMSFT_Header {
50 /*0x00*/INT magic1; /* 0x5446534D "MSFT" */
51 INT magic2; /* 0x00010002 version nr? */
52 INT posguid; /* position of libid in guid table */
53 /* (should be, else -1) */
54 INT lcid; /* locale id */
55 /*0x10*/INT lcid2;
56 INT varflags; /* (largely) unknown flags */
57 /* the lower nibble is syskind */
58 /* 0x40 always seems to be set */
59 /* 0x10 set with a helpfile defined */
60 /* 0x100 set with a helpstringdll defined - in this
61 case the offset to the name in the stringtable
62 appears right after this struct, before the
63 typeinfo offsets */
64 INT version; /* set with SetVersion() */
65 INT flags; /* set with SetFlags() */
66 /*0x20*/INT nrtypeinfos; /* number of typeinfo's (till so far) */
67 INT helpstring; /* position of help string in stringtable */
68 INT helpstringcontext;
69 INT helpcontext;
70 /*0x30*/INT nametablecount; /* number of names in name table */
71 INT nametablechars; /* nr of characters in name table */
72 INT NameOffset; /* offset of name in name table */
73 INT helpfile; /* position of helpfile in stringtable */
74 /*0x40*/INT CustomDataOffset; /* if -1 no custom data, else it is offset */
75 /* in customer data/guid offset table */
76 INT res44; /* unknown always: 0x20 (guid hash size?) */
77 INT res48; /* unknown always: 0x80 (name hash size?) */
78 INT dispatchpos; /* HREFTYPE to IDispatch, or -1 if no IDispatch */
79 /*0x50*/INT res50; /* is zero becomes one when an interface is derived */
80 } MSFT_Header;
81
82 /* segments in the type lib file have a structure like this: */
83 typedef struct tagMSFT_pSeg {
84 INT offset; /* absolute offset in file */
85 INT length; /* length of segment */
86 INT res08; /* unknown always -1 */
87 INT res0c; /* unknown always 0x0f in the header */
88 /* 0x03 in the typeinfo_data */
89 } MSFT_pSeg;
90
91 /* layout of the main segment directory */
92 typedef struct tagMSFT_SegDir {
93 /*1*/MSFT_pSeg pTypeInfoTab; /* each type info get an entry of 0x64 bytes */
94 /* (25 ints) */
95 /*2*/MSFT_pSeg pImpInfo; /* table with info for imported types */
96 /*3*/MSFT_pSeg pImpFiles; /* import libaries */
97 /*4*/MSFT_pSeg pRefTab; /* References table */
98 /*5*/MSFT_pSeg pLibtab; /* always exists, alway same size (0x80) */
99 /* hash table w offsets to guid????? */
100 /*6*/MSFT_pSeg pGuidTab; /* all guids are stored here together with */
101 /* offset in some table???? */
102 /*7*/MSFT_pSeg res07; /* always created, alway same size (0x200) */
103 /* purpose largely unknown */
104 /*8*/MSFT_pSeg pNametab; /* name tables */
105 /*9*/MSFT_pSeg pStringtab; /* string table */
106 /*A*/MSFT_pSeg pTypdescTab; /* table with type descriptors */
107 /*B*/MSFT_pSeg pArrayDescriptions;
108 /*C*/MSFT_pSeg pCustData; /* data table, used for custom data and default */
109 /* parameter values */
110 /*D*/MSFT_pSeg pCDGuids; /* table with offsets for the guids and into */
111 /* the customer data table */
112 /*E*/MSFT_pSeg res0e; /* unknown */
113 /*F*/MSFT_pSeg res0f; /* unknown */
114 } MSFT_SegDir;
115
116
117 /* base type info data */
118 typedef struct tagMSFT_TypeInfoBase {
119 /*000*/ INT typekind; /* it is the TKIND_xxx */
120 /* some byte alignment stuf */
121 INT memoffset; /* points past the file, if no elements */
122 INT res2; /* zero if no element, N*0x40 */
123 INT res3; /* -1 if no lement, (N-1)*0x38 */
124 /*010*/ INT res4; /* always? 3 */
125 INT res5; /* always? zero */
126 INT cElement; /* counts elements, HI=cVars, LO=cFuncs */
127 INT res7; /* always? zero */
128 /*020*/ INT res8; /* always? zero */
129 INT res9; /* always? zero */
130 INT resA; /* always? zero */
131 INT posguid; /* position in guid table */
132 /*030*/ INT flags; /* Typeflags */
133 INT NameOffset; /* offset in name table */
134 INT version; /* element version */
135 INT docstringoffs; /* offset of docstring in string tab */
136 /*040*/ INT helpstringcontext; /* */
137 INT helpcontext; /* */
138 INT oCustData; /* offset in customer data table */
139 #ifdef WORDS_BIGENDIAN
140 INT16 cbSizeVft; /* virtual table size, including inherits */
141 INT16 cImplTypes; /* nr of implemented interfaces */
142 #else
143 INT16 cImplTypes; /* nr of implemented interfaces */
144 INT16 cbSizeVft; /* virtual table size, including inherits */
145 #endif
146 /*050*/ INT size; /* size in bytes, at least for structures */
147 /* FIXME: name of this field */
148 INT datatype1; /* position in type description table */
149 /* or in base intefaces */
150 /* if coclass: offset in reftable */
151 /* if interface: reference to inherited if */
152 INT datatype2; /* for interfaces: hiword is num of inherited funcs */
153 /* loword is num of inherited interfaces */
154 INT res18; /* always? 0 */
155 /*060*/ INT res19; /* always? -1 */
156 } MSFT_TypeInfoBase;
157
158 /* layout of an entry with information on imported types */
159 typedef struct tagMSFT_ImpInfo {
160 INT res0; /* unknown */
161 INT oImpFile; /* offset inthe Import File table */
162 INT oGuid; /* offset in Guid table */
163 } MSFT_ImpInfo;
164
165 /* function description data */
166 typedef struct {
167 /* INT recsize; record size including some xtra stuff */
168 INT DataType; /* data type of the member, eg return of function */
169 INT Flags; /* something to do with attribute flags (LOWORD) */
170 #ifdef WORDS_BIGENDIAN
171 INT16 funcdescsize; /* size of reconstituted FUNCDESC and related structs */
172 INT16 VtableOffset; /* offset in vtable */
173 #else
174 INT16 VtableOffset; /* offset in vtable */
175 INT16 funcdescsize; /* size of reconstituted FUNCDESC and related structs */
176 #endif
177 INT FKCCIC; /* bit string with the following */
178 /* meaning (bit 0 is the lsb): */
179 /* bits 0 - 2: FUNCKIND */
180 /* bits 3 - 6: INVOKEKIND */
181 /* bit 7: custom data present */
182 /* bits 8 - 11: CALLCONV */
183 /* bit 12: parameters have default values */
184 /* bit 13: oEntry is numeric */
185 /* bit 14: has retval param */
186 /* bits 16 - 31: index of next function with same id */
187 #ifdef WORDS_BIGENDIAN
188 INT16 nroargs; /* nr of optional arguments */
189 INT16 nrargs; /* number of arguments (including optional ????) */
190 #else
191 INT16 nrargs; /* number of arguments (including optional ????) */
192 INT16 nroargs; /* nr of optional arguments */
193 #endif
194 /* optional attribute fields, the number of them is variable */
195 INT OptAttr[1];
196 /*
197 0* INT helpcontext;
198 1* INT oHelpString;
199 2* INT oEntry; // either offset in string table or numeric as it is (see bit 13 of FKCCIC) //
200 3* INT res9; // unknown (-1) //
201 4* INT resA; // unknown (-1) //
202 5* INT HelpStringContext;
203 // these are controlled by a bit set in the FKCCIC field //
204 6* INT oCustData; // custom data for function //
205 7* INT oArgCustData[1]; // custom data per argument //
206 */
207 } MSFT_FuncRecord;
208
209 /* after this may follow an array with default value pointers if the
210 * appropriate bit in the FKCCIC field has been set:
211 * INT oDefautlValue[nrargs];
212 */
213
214 /* Parameter info one per argument*/
215 typedef struct {
216 INT DataType;
217 INT oName;
218 INT Flags;
219 } MSFT_ParameterInfo;
220
221 /* Variable description data */
222 typedef struct {
223 /* INT recsize; // record size including some xtra stuff */
224 INT DataType; /* data type of the variable */
225 INT Flags; /* VarFlags (LOWORD) */
226 #ifdef WORDS_BIGENDIAN
227 INT16 vardescsize; /* size of reconstituted VARDESC and related structs */
228 INT16 VarKind; /* VarKind */
229 #else
230 INT16 VarKind; /* VarKind */
231 INT16 vardescsize; /* size of reconstituted VARDESC and related structs */
232 #endif
233 INT OffsValue; /* value of the variable or the offset */
234 /* in the data structure */
235 /* optional attribute fields, the number of them is variable */
236 /* controlled by record length */
237 INT HelpContext;
238 INT oHelpString;
239 INT res9; /* unknown (-1) */
240 INT oCustData; /* custom data for variable */
241 INT HelpStringContext;
242
243 } MSFT_VarRecord;
244
245 /* Structure of the reference data */
246 typedef struct {
247 INT reftype; /* either offset in type info table, then it's */
248 /* a multiple of 64 */
249 /* or offset in the external reference table */
250 /* with an offset of 1 */
251 INT flags;
252 INT oCustData; /* custom data */
253 INT onext; /* next offset, -1 if last */
254 } MSFT_RefRecord;
255
256 /* this is how a guid is stored */
257 typedef struct {
258 GUID guid;
259 INT hreftype; /* -2 for the typelib guid, typeinfo offset
260 for typeinfo guid, low two bits are 01 if
261 this is an imported typeinfo, low two bits
262 are 10 if this is an imported typelib (used
263 by imported typeinfos) */
264 INT next_hash; /* offset to next guid in the hash bucket */
265 } MSFT_GuidEntry;
266 /* some data preceding entries in the name table */
267 typedef struct {
268 INT hreftype; /* is -1 if name is for neither a typeinfo,
269 a variable, or a function (that is, name
270 is for a typelib or a function parameter).
271 otherwise is the offset of the first
272 typeinfo that this name refers to (either
273 to the typeinfo itself or to a member of
274 the typeinfo */
275 INT next_hash; /* offset to next name in the hash bucket */
276 INT namelen; /* only lower 8 bits are valid */
277 /* 0x1000 if name is only used once as a variable name */
278 /* 0x2000 if name is a variable in an enumeration */
279 /* 0x3800 if name is typeinfo name */
280 /* upper 16 bits are hash code */
281 } MSFT_NameIntro;
282 /* the custom data table directory has enties like this */
283 typedef struct {
284 INT GuidOffset;
285 INT DataOffset;
286 INT next; /* next offset in the table, -1 if it's the last */
287 } MSFT_CDGuid;
288
289
290 /***********************************************************
291 *
292 * SLTG typelibs.
293 *
294 * These are created with ICreateTypeLib
295 *
296 */
297
298 #include "pshpack1.h"
299
300 typedef struct {
301 /*00*/ DWORD SLTG_magic; /* 0x47544c53 == "SLTG" */
302 /*04*/ WORD nrOfFileBlks; /* no of SLTG_BlkEntry's + 1 */
303 /*06*/ WORD res06; /* ?? always 9 */
304 /*08*/ WORD res08; /* some kind of len/offset ?? */
305 /*0a*/ WORD first_blk; /* 1 based index into blk entries that
306 corresponds to first block in file */
307 /*0c*/ DWORD res0c; /* always 0x000204ff */
308 /*10*/ DWORD res10; /* always 0x00000000 */
309 /*14*/ DWORD res14; /* always 0x000000c0 */
310 /*18*/ DWORD res18; /* always 0x46000000 */
311 /*1c*/ DWORD res1c; /* always 0x00000044 */
312 /*20*/ DWORD res20; /* always 0xffff0000 */
313 } SLTG_Header;
314
315 /* This gets followed by a list of block entries */
316 typedef struct {
317 /*00*/ DWORD len;
318 /*04*/ WORD index_string; /* offs from start of SLTG_Magic to index string */
319 /*06*/ WORD next;
320 } SLTG_BlkEntry;
321
322 /* The order of the blocks in the file is given by starting at Block
323 entry firt_blk and stepping through using the next pointer */
324
325 /* These then get followed by this magic */
326 typedef struct {
327 /*00*/ BYTE res00; /* always 0x01 */
328 /*01*/ CHAR CompObj_magic[8]; /* always "CompObj" */
329 /*09*/ CHAR dir_magic[4]; /* always "dir" */
330 } SLTG_Magic;
331
332 #define SLTG_COMPOBJ_MAGIC "CompObj"
333 #define SLTG_DIR_MAGIC "dir"
334
335 /* Next we have SLTG_Header.nrOfFileBlks - 2 of Index strings. These
336 are presumably unique to within the file and look something like
337 "AAAAAAAAAA" with the first character incremented from 'A' to ensure
338 uniqueness. I guess successive chars increment when we need to wrap
339 the first one. */
340
341 typedef struct {
342 /*00*/ CHAR string[11];
343 } SLTG_Index;
344
345
346 /* This is followed by SLTG_pad9 */
347 typedef struct {
348 /*00*/ CHAR pad[9]; /* 9 '\0's */
349 } SLTG_Pad9;
350
351
352 /* Now we have the noOfFileBlks - 1 worth of blocks. The length of
353 each block is given by its entry in SLTG_BlkEntry. */
354
355 /* type SLTG_NAME in rather like a BSTR except that the length in
356 bytes is given by the first WORD and the string contains 8bit chars */
357
358 typedef WORD SLTG_Name;
359
360 /* The main library block looks like this. This one seems to come last */
361
362 typedef struct {
363 /*00*/ WORD magic; /* 0x51cc */
364 /*02*/ WORD res02; /* 0x0003, 0x0004 */
365 /*04*/ WORD name; /* offset to name in name table */
366 /*06*/ SLTG_Name res06; /* maybe this is just WORD == 0xffff */
367 SLTG_Name helpstring;
368 SLTG_Name helpfile;
369 DWORD helpcontext;
370 WORD syskind; /* == 1 for win32, 0 for win16 */
371 WORD lcid; /* == 0x409, 0x809 etc */
372 DWORD res12; /* == 0 */
373 WORD libflags; /* LIBFLAG_* */
374 WORD maj_vers;
375 WORD min_vers;
376 GUID uuid;
377 } SLTG_LibBlk;
378
379 #define SLTG_LIBBLK_MAGIC 0x51cc
380
381 /* we then get 0x40 bytes worth of 0xffff or small numbers followed by
382 nrOfFileBlks - 2 of these */
383 typedef struct {
384 WORD small_no;
385 SLTG_Name index_name; /* This refers to a name in the directory */
386 SLTG_Name other_name; /* Another one of these weird names */
387 WORD res1a; /* 0xffff */
388 WORD name_offs; /* offset to name in name table */
389 WORD more_bytes; /* if this is non-zero we get this many
390 bytes before the next element, which seem
391 to reference the docstring of the type ? */
392 WORD res20; /* 0xffff */
393 DWORD helpcontext;
394 WORD res26; /* 0xffff */
395 GUID uuid;
396 } SLTG_OtherTypeInfo;
397
398 /* Next we get WORD 0x0003 followed by a DWORD which if we add to
399 0x216 gives the offset to the name table from the start of the LibBlk
400 struct */
401
402 typedef struct {
403 /*00*/ WORD magic; /* 0x0501 */
404 /*02*/ DWORD href_table; /* if not 0xffffffff, then byte offset from
405 beginning of struct to href table */
406 /*06*/ DWORD res06; /* 0xffffffff */
407 /*0a*/ DWORD elem_table; /* offset to members */
408 /*0e*/ DWORD res0e; /* 0xffffffff */
409 /*12*/ WORD major_version; /* major version number */
410 /*14*/ WORD minor_version; /* minor version number */
411 /*16*/ DWORD res16; /* 0xfffe0000 */
412 /*1a*/ BYTE typeflags1;/* 0x02 | top 5 bits hold l5sbs of TYPEFLAGS */
413 /*1b*/ BYTE typeflags2;/* TYPEFLAGS >> 5 */
414 /*1c*/ BYTE typeflags3;/* 0x02*/
415 /*1d*/ BYTE typekind; /* 0x03 == TKIND_INTERFACE etc. */
416 /*1e*/ DWORD res1e; /* 0x00000000 or 0xffffffff */
417 } SLTG_TypeInfoHeader;
418
419 #define SLTG_TIHEADER_MAGIC 0x0501
420
421 typedef struct {
422 /*00*/ WORD cFuncs;
423 /*02*/ WORD cVars;
424 /*04*/ WORD cImplTypes;
425 /*06*/ WORD res06;
426 /*08*/ WORD res08;
427 /*0a*/ WORD res0a;
428 /*0c*/ WORD res0c;
429 /*0e*/ WORD res0e;
430 /*10*/ WORD res10;
431 /*12*/ WORD res12;
432 /*14*/ WORD tdescalias_vt; /* for TKIND_ALIAS */
433 /*16*/ WORD res16;
434 /*18*/ WORD res18;
435 /*1a*/ WORD res1a;
436 /*1c*/ WORD res1c;
437 /*1e*/ WORD res1e;
438 /*20*/ WORD cbSizeInstance;
439 /*22*/ WORD cbAlignment;
440 /*24*/ WORD res24;
441 /*26*/ WORD res26;
442 /*28*/ WORD cbSizeVft;
443 /*2a*/ WORD res2a;
444 /*2c*/ WORD res2c;
445 /*2e*/ WORD res2e;
446 /*30*/ WORD res30;
447 /*32*/ WORD res32;
448 /*34*/ WORD res34;
449 } SLTG_TypeInfoTail;
450
451 typedef struct {
452 /*00*/ WORD res00; /* 0x0001 sometimes 0x0003 ?? */
453 /*02*/ WORD res02; /* 0xffff */
454 /*04*/ BYTE res04; /* 0x01 */
455 /*05*/ DWORD cbExtra; /* No of bytes that follow */
456 } SLTG_MemberHeader;
457
458 typedef struct {
459 /*00*/ WORD magic; /* 0x120a */
460 /*02*/ WORD next; /* offset in bytes to next block from start of block
461 group, 0xffff if last item */
462 /*04*/ WORD name; /* offset to name within name table */
463 /*06*/ WORD value; /* offset to value from start of block group */
464 /*08*/ WORD res08; /* 0x56 */
465 /*0a*/ DWORD memid; /* memid */
466 /*0e*/ WORD helpcontext;/* 0xfffe == no context, 0x0001 == stored in EnumInfo struct, else offset
467 to value from start of block group */
468 /*10*/ WORD helpstring;/* offset from start of block group to string offset */
469 } SLTG_EnumItem;
470
471 #define SLTG_ENUMITEM_MAGIC 0x120a
472
473 typedef struct {
474 /*00*/ WORD vt; /* vartype, 0xffff marks end. */
475 /*02*/ WORD res02; /* ?, 0xffff marks end */
476 } SLTG_AliasItem;
477
478 #define SLTG_ALIASITEM_MAGIC 0x001d
479
480
481 typedef struct {
482 BYTE magic; /* 0x4c or 0x6c */
483 BYTE inv; /* high nibble is INVOKE_KIND, low nibble = 2 */
484 WORD next; /* byte offset from beginning of group to next fn */
485 WORD name; /* Offset within name table to name */
486 DWORD dispid; /* dispid */
487 WORD helpcontext; /* helpcontext (again 1 is special) */
488 WORD helpstring;/* helpstring offset to offset */
489 WORD arg_off; /* offset to args from start of block */
490 BYTE nacc; /* lowest 3bits are CALLCONV, rest are no of args */
491 BYTE retnextopt;/* if 0x80 bit set ret type follows else next WORD
492 is offset to ret type. No of optional args is
493 middle 6 bits */
494 WORD rettype; /* return type VT_?? or offset to ret type */
495 WORD vtblpos; /* position in vtbl? */
496 WORD funcflags; /* present if magic == 0x6c */
497 /* Param list starts, repeat next two as required */
498 #if 0
499 WORD name; /* offset to 2nd letter of name */
500 WORD+ type; /* VT_ of param */
501 #endif
502 } SLTG_Function;
503
504 #define SLTG_FUNCTION_MAGIC 0x4c
505 #define SLTG_FUNCTION_WITH_FLAGS_MAGIC 0x6c
506
507 typedef struct {
508 /*00*/ BYTE magic; /* 0xdf */
509 /*01*/ BYTE res01; /* 0x00 */
510 /*02*/ DWORD res02; /* 0xffffffff */
511 /*06*/ DWORD res06; /* 0xffffffff */
512 /*0a*/ DWORD res0a; /* 0xffffffff */
513 /*0e*/ DWORD res0e; /* 0xffffffff */
514 /*12*/ DWORD res12; /* 0xffffffff */
515 /*16*/ DWORD res16; /* 0xffffffff */
516 /*1a*/ DWORD res1a; /* 0xffffffff */
517 /*1e*/ DWORD res1e; /* 0xffffffff */
518 /*22*/ DWORD res22; /* 0xffffffff */
519 /*26*/ DWORD res26; /* 0xffffffff */
520 /*2a*/ DWORD res2a; /* 0xffffffff */
521 /*2e*/ DWORD res2e; /* 0xffffffff */
522 /*32*/ DWORD res32; /* 0xffffffff */
523 /*36*/ DWORD res36; /* 0xffffffff */
524 /*3a*/ DWORD res3a; /* 0xffffffff */
525 /*3e*/ DWORD res3e; /* 0xffffffff */
526 /*42*/ WORD res42; /* 0xffff */
527 /*44*/ DWORD number; /* this is 8 times the number of refs */
528 /*48*/ /* Now we have number bytes (8 for each ref) of SLTG_UnknownRefInfo */
529
530 /*50*/ WORD res50; /* 0xffff */
531 /*52*/ BYTE res52; /* 0x01 */
532 /*53*/ DWORD res53; /* 0x00000000 */
533 /*57*/ SLTG_Name names[1];
534 /* Now we have number/8 SLTG_Names (first WORD is no of bytes in the ascii
535 * string). Strings look like "*\Rxxxx*#n". If xxxx == ffff then the
536 * ref refers to the nth type listed in this library (0 based). Else
537 * the xxxx (which maybe fewer than 4 digits) is the offset into the name
538 * table to a string "*\G{<guid>}#1.0#0#C:\WINNT\System32\stdole32.tlb#"
539 * The guid is the typelib guid; the ref again refers to the nth type of
540 * the imported typelib.
541 */
542
543 /*xx*/ BYTE resxx; /* 0xdf */
544
545 } SLTG_RefInfo;
546
547 #define SLTG_REF_MAGIC 0xdf
548
549 typedef struct {
550 WORD res00; /* 0x0001 */
551 BYTE res02; /* 0x02 */
552 BYTE res03; /* 0x40 if internal ref, 0x00 if external ? */
553 WORD res04; /* 0xffff */
554 WORD res06; /* 0x0000, 0x0013 or 0xffff ?? */
555 } SLTG_UnknownRefInfo;
556
557 typedef struct {
558 WORD res00; /* 0x004a */
559 WORD next; /* byte offs to next interface */
560 WORD res04; /* 0xffff */
561 BYTE impltypeflags; /* IMPLTYPEFLAG_* */
562 BYTE res07; /* 0x80 */
563 WORD res08; /* 0x0012, 0x0028 ?? */
564 WORD ref; /* number in ref table ? */
565 WORD res0c; /* 0x4000 */
566 WORD res0e; /* 0xfffe */
567 WORD res10; /* 0xffff */
568 WORD res12; /* 0x001d */
569 WORD pos_in_table; /* 0x0, 0x4, ? */
570 } SLTG_ImplInfo;
571
572 #define SLTG_IMPL_MAGIC 0x004a
573
574 typedef struct {
575 BYTE magic; /* 0x0a */
576 BYTE typepos;
577 WORD next;
578 WORD name;
579 WORD byte_offs; /* pos in struct */
580 WORD type; /* if typepos == 0x02 this is the type, else offset to type */
581 DWORD memid;
582 WORD helpcontext; /* ?? */
583 WORD helpstring; /* ?? */
584 } SLTG_RecordItem;
585
586 #define SLTG_RECORD_MAGIC 0x0a
587
588
589 /* CARRAYs look like this
590 WORD type == VT_CARRAY
591 WORD offset from start of block to SAFEARRAY
592 WORD typeofarray
593 */
594
595 #include "poppack.h"
596
597 /*---------------------------END--------------------------------------------*/
598 #endif