ReactOS 0.4.17-dev-581-g16bb138
usrmarshal.c
Go to the documentation of this file.
1/*
2 * Misc marshalling routines
3 *
4 * Copyright 2002 Ove Kaaven
5 * Copyright 2003 Mike Hearn
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 <stdarg.h>
23#include <string.h>
24
25#define COBJMACROS
26#include "windef.h"
27#include "winbase.h"
28#include "wingdi.h"
29#include "winuser.h"
30#include "winerror.h"
31
32#include "ole2.h"
33#include "oleauto.h"
34#include "typelib.h"
35#include "ocidl.h"
36#include "wine/debug.h"
37
39
40#define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
41#define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
42#define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
43#define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
44
45/* ole32 exports those, not defined in public headers */
47unsigned char * __RPC_USER WdtpInterfacePointer_UserMarshal(ULONG*, ULONG, unsigned char*, IUnknown*, REFIID);
48unsigned char * __RPC_USER WdtpInterfacePointer_UserUnmarshal(ULONG*, unsigned char*, IUnknown**, REFIID);
49
50static void dump_user_flags(const ULONG *pFlags)
51{
53 TRACE("MAKELONG(NDR_LOCAL_REPRESENTATION, ");
54 else
55 TRACE("MAKELONG(0x%04x, ", HIWORD(*pFlags));
56 switch (LOWORD(*pFlags))
57 {
58 case MSHCTX_LOCAL: TRACE("MSHCTX_LOCAL)"); break;
59 case MSHCTX_NOSHAREDMEM: TRACE("MSHCTX_NOSHAREDMEM)"); break;
60 case MSHCTX_DIFFERENTMACHINE: TRACE("MSHCTX_DIFFERENTMACHINE)"); break;
61 case MSHCTX_INPROC: TRACE("MSHCTX_INPROC)"); break;
62 default: TRACE("%d)", LOWORD(*pFlags));
63 }
64}
65
66/* CLEANLOCALSTORAGE */
67
68#define CLS_FUNCDESC 'f'
69#define CLS_LIBATTR 'l'
70#define CLS_TYPEATTR 't'
71#define CLS_VARDESC 'v'
72
73ULONG WINAPI CLEANLOCALSTORAGE_UserSize(ULONG *pFlags, ULONG Start, CLEANLOCALSTORAGE *pstg)
74{
76 return Start + sizeof(DWORD);
77}
78
79unsigned char * WINAPI CLEANLOCALSTORAGE_UserMarshal(ULONG *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstg)
80{
82 *(DWORD*)Buffer = pstg->flags;
83
84 if (!pstg->pInterface)
85 return Buffer + sizeof(DWORD);
86
87 switch(pstg->flags)
88 {
89 case CLS_LIBATTR:
90 ITypeLib_ReleaseTLibAttr((ITypeLib*)pstg->pInterface, *(TLIBATTR**)pstg->pStorage);
91 break;
92 case CLS_TYPEATTR:
93 ITypeInfo_ReleaseTypeAttr((ITypeInfo*)pstg->pInterface, *(TYPEATTR**)pstg->pStorage);
94 break;
95 case CLS_FUNCDESC:
96 ITypeInfo_ReleaseFuncDesc((ITypeInfo*)pstg->pInterface, *(FUNCDESC**)pstg->pStorage);
97 break;
98 case CLS_VARDESC:
99 ITypeInfo_ReleaseVarDesc((ITypeInfo*)pstg->pInterface, *(VARDESC**)pstg->pStorage);
100 break;
101
102 default:
103 ERR("Unknown type %lx\n", pstg->flags);
104 }
105
106 *(VOID**)pstg->pStorage = NULL;
107 IUnknown_Release(pstg->pInterface);
108 pstg->pInterface = NULL;
109
110 return Buffer + sizeof(DWORD);
111}
112
113unsigned char * WINAPI CLEANLOCALSTORAGE_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstr)
114{
116 pstr->flags = *(DWORD*)Buffer;
117 return Buffer + sizeof(DWORD);
118}
119
120void WINAPI CLEANLOCALSTORAGE_UserFree(ULONG *pFlags, CLEANLOCALSTORAGE *pstr)
121{
122 /* Nothing to do */
123}
124
125/* BSTR */
126
127typedef struct
128{
129 DWORD len; /* No. of chars not including trailing '\0' */
130 DWORD byte_len; /* len * 2 or 0xffffffff if len == 0 */
131 DWORD len2; /* == len */
133
135{
136 TRACE("%#lx, %lu, %p => %p\n", *pFlags, Start, pstr, *pstr);
137 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
139 Start += sizeof(bstr_wire_t) + ((SysStringByteLen(*pstr) + 1) & ~1);
140 TRACE("returning %ld\n", Start);
141 return Start;
142}
143
144unsigned char * WINAPI BSTR_UserMarshal(ULONG *pFlags, unsigned char *Buffer, BSTR *pstr)
145{
147 DWORD len = SysStringByteLen(*pstr);
148
149 TRACE("%#lx, %p, %p => %p\n", *pFlags, Buffer, pstr, *pstr);
150 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
151
154 header->len = header->len2 = (len + 1) / 2;
155 if (*pstr)
156 {
157 header->byte_len = len;
158 memcpy(header + 1, *pstr, header->len * 2);
159 }
160 else
161 header->byte_len = 0xffffffff; /* special case for a null bstr */
162
163 return Buffer + sizeof(*header) + sizeof(OLECHAR) * header->len;
164}
165
166unsigned char * WINAPI BSTR_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, BSTR *pstr)
167{
169 TRACE("%#lx, %p, %p => %p\n", *pFlags, Buffer, pstr, *pstr);
170
173 if(header->len != header->len2)
174 FIXME("len %#lx != len2 %#lx\n", header->len, header->len2);
175
176 if (header->byte_len == 0xffffffff)
177 {
178 SysFreeString(*pstr);
179 *pstr = NULL;
180 }
181 else SysReAllocStringLen( pstr, (OLECHAR *)(header + 1), header->len );
182
183 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
184 return Buffer + sizeof(*header) + sizeof(OLECHAR) * header->len;
185}
186
187void WINAPI BSTR_UserFree(ULONG *pFlags, BSTR *pstr)
188{
189 TRACE("%#lx, %p => %p\n", *pFlags, pstr, *pstr);
190 SysFreeString(*pstr);
191 *pstr = NULL;
192}
193
194/* VARIANT */
195
196typedef struct
197{
206
207unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
208{
209 if (vt & VT_ARRAY) return 4;
210
211 switch (vt & ~VT_BYREF) {
212 case VT_EMPTY:
213 case VT_NULL:
214 return 0;
215 case VT_I1:
216 case VT_UI1:
217 return sizeof(CHAR);
218 case VT_I2:
219 case VT_UI2:
220 return sizeof(SHORT);
221 case VT_I4:
222 case VT_UI4:
223 case VT_HRESULT:
224 return sizeof(LONG);
225 case VT_INT:
226 case VT_UINT:
227 return sizeof(INT);
228 case VT_I8:
229 case VT_UI8:
230 return sizeof(LONGLONG);
231 case VT_R4:
232 return sizeof(FLOAT);
233 case VT_R8:
234 return sizeof(DOUBLE);
235 case VT_BOOL:
236 return sizeof(VARIANT_BOOL);
237 case VT_ERROR:
238 return sizeof(SCODE);
239 case VT_DATE:
240 return sizeof(DATE);
241 case VT_CY:
242 return sizeof(CY);
243 case VT_DECIMAL:
244 return sizeof(DECIMAL);
245 case VT_BSTR:
246 return sizeof(ULONG);
247 case VT_VARIANT:
248 return sizeof(VARIANT);
249 case VT_UNKNOWN:
250 case VT_DISPATCH:
251 case VT_RECORD:
252 return 0;
253 default:
254 FIXME("unhandled VT %d\n", vt);
255 return 0;
256 }
257}
258
259static unsigned int get_type_alignment(ULONG *pFlags, VARTYPE vt)
260{
261 unsigned int size = get_type_size(pFlags, vt);
262 if(vt & VT_BYREF) return 3;
263 if(size == 0) return 0;
264 if(size <= 4) return size - 1;
265 return 7;
266}
267
268/* WdtpInterfacePointer_UserSize takes care of 2 additional DWORDs to store marshalling buffer size */
270{
271 ULONG size = 0;
272
273 if (punk)
274 {
275 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), 0, punk, riid);
276 if (!size)
277 {
278 ERR("interface variant buffer size calculation failed\n");
279 return 0;
280 }
281 }
282 size += sizeof(ULONG);
283 TRACE("wire-size extra of interface variant is %ld.\n", size);
284 return Start + size;
285}
286
288{
289 if (V_ISARRAY(pvar))
290 {
291 if (V_ISBYREF(pvar))
292 return LPSAFEARRAY_UserSize(pFlags, Start, V_ARRAYREF(pvar));
293 else
294 return LPSAFEARRAY_UserSize(pFlags, Start, &V_ARRAY(pvar));
295 }
296
297 switch (V_VT(pvar)) {
298 case VT_BSTR:
299 return BSTR_UserSize(pFlags, Start, &V_BSTR(pvar));
300 case VT_BSTR | VT_BYREF:
301 return BSTR_UserSize(pFlags, Start, V_BSTRREF(pvar));
302 case VT_VARIANT | VT_BYREF:
303 return VARIANT_UserSize(pFlags, Start, V_VARIANTREF(pvar));
304 case VT_UNKNOWN:
305 return interface_user_size(pFlags, Start, &IID_IUnknown, V_UNKNOWN(pvar));
306 case VT_UNKNOWN | VT_BYREF:
307 return interface_user_size(pFlags, Start, &IID_IUnknown, *V_UNKNOWNREF(pvar));
308 case VT_DISPATCH:
309 return interface_user_size(pFlags, Start, &IID_IDispatch, (IUnknown*)V_DISPATCH(pvar));
310 case VT_DISPATCH | VT_BYREF:
312 case VT_RECORD:
313 FIXME("wire-size record\n");
314 return Start;
315 case VT_SAFEARRAY:
316 case VT_SAFEARRAY | VT_BYREF:
317 FIXME("wire-size safearray: shouldn't be marshaling this\n");
318 return Start;
319 default:
320 return Start;
321 }
322}
323
324/* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the buffer */
325static unsigned char* interface_user_marshal(ULONG *pFlags, unsigned char *Buffer,
327{
328 TRACE("%#lx, %p, %p.\n", *pFlags, Buffer, punk);
329
330 /* first DWORD is used to store pointer itself, truncated on win64 */
331 if(!punk)
332 {
333 memset(Buffer, 0, sizeof(ULONG));
334 return Buffer + sizeof(ULONG);
335 }
336 else
337 {
339 Buffer += sizeof(DWORD);
340 }
341
342 return WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), Buffer, punk, riid);
343}
344
345/* helper: called for VT_DISPATCH / VT_UNKNOWN variants to unmarshal the buffer */
346static unsigned char *interface_user_unmarshal(ULONG *pFlags, unsigned char *Buffer,
347 REFIID riid, IUnknown **ppunk)
348{
349 DWORD ptr;
350
351 TRACE("%#lx, %p, %p.\n", *pFlags, Buffer, ppunk);
352
353 /* skip pointer part itself */
354 ptr = *(DWORD*)Buffer;
355 Buffer += sizeof(DWORD);
356
357 if(!ptr)
358 return Buffer;
359
360 return WdtpInterfacePointer_UserUnmarshal(pFlags, Buffer, ppunk, riid);
361}
362
364{
365 int align;
366 TRACE("%#lx, %lu, %p.\n", *pFlags, Start, pvar);
367 TRACE("vt=%04x\n", V_VT(pvar));
368
370 Start += sizeof(variant_wire_t);
371 if(V_VT(pvar) & VT_BYREF)
372 Start += 4;
373
374 align = get_type_alignment(pFlags, V_VT(pvar));
376 if(V_VT(pvar) == (VT_VARIANT | VT_BYREF))
377 Start += 4;
378 else
379 Start += get_type_size(pFlags, V_VT(pvar));
380 Start = wire_extra_user_size(pFlags, Start, pvar);
381
382 TRACE("returning %ld\n", Start);
383 return Start;
384}
385
386unsigned char * WINAPI VARIANT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, VARIANT *pvar)
387{
389 ULONG type_size;
390 int align;
391 unsigned char *Pos;
392
393 TRACE("%#lx, %p, %p.\n", *pFlags, Buffer, pvar);
394 TRACE("vt=%04x\n", V_VT(pvar));
395
397
399
400 header->clSize = 0; /* fixed up at the end */
401 header->rpcReserved = 0;
402 header->vt = V_VT(pvar);
403#ifdef __REACTOS__
404 header->wReserved1 = pvar->n1.n2.wReserved1;
405 header->wReserved2 = pvar->n1.n2.wReserved2;
406 header->wReserved3 = pvar->n1.n2.wReserved3;
407#else
408 header->wReserved1 = pvar->wReserved1;
409 header->wReserved2 = pvar->wReserved2;
410 header->wReserved3 = pvar->wReserved3;
411#endif
412 header->switch_is = V_VT(pvar);
413 if(header->switch_is & VT_ARRAY)
414 header->switch_is &= ~VT_TYPEMASK;
415
416 Pos = (unsigned char*)(header + 1);
417 type_size = get_type_size(pFlags, V_VT(pvar));
418 align = get_type_alignment(pFlags, V_VT(pvar));
420
421 if(header->vt & VT_BYREF)
422 {
423 *(DWORD *)Pos = max(type_size, 4);
424 Pos += 4;
425 if((header->vt & VT_TYPEMASK) != VT_VARIANT)
426 {
427 memcpy(Pos, V_BYREF(pvar), type_size);
428 Pos += type_size;
429 }
430 else
431 {
432 *(DWORD*)Pos = 'U' | 's' << 8 | 'e' << 16 | 'r' << 24;
433 Pos += 4;
434 }
435 }
436 else
437 {
438 if((header->vt & VT_TYPEMASK) == VT_DECIMAL)
439 memcpy(Pos, pvar, type_size);
440 else
441 memcpy(Pos, &V_UI8(pvar), type_size);
442 Pos += type_size;
443 }
444
445 if(header->vt & VT_ARRAY)
446 {
447 if(header->vt & VT_BYREF)
448 Pos = LPSAFEARRAY_UserMarshal(pFlags, Pos, V_ARRAYREF(pvar));
449 else
450 Pos = LPSAFEARRAY_UserMarshal(pFlags, Pos, &V_ARRAY(pvar));
451 }
452 else
453 {
454 switch (header->vt)
455 {
456 case VT_BSTR:
457 Pos = BSTR_UserMarshal(pFlags, Pos, &V_BSTR(pvar));
458 break;
459 case VT_BSTR | VT_BYREF:
460 Pos = BSTR_UserMarshal(pFlags, Pos, V_BSTRREF(pvar));
461 break;
462 case VT_VARIANT | VT_BYREF:
463 Pos = VARIANT_UserMarshal(pFlags, Pos, V_VARIANTREF(pvar));
464 break;
465 case VT_UNKNOWN:
467 break;
468 case VT_UNKNOWN | VT_BYREF:
470 break;
471 case VT_DISPATCH:
473 break;
474 case VT_DISPATCH | VT_BYREF:
476 break;
477 case VT_RECORD:
478 FIXME("handle BRECORD by val\n");
479 break;
480 case VT_RECORD | VT_BYREF:
481 FIXME("handle BRECORD by ref\n");
482 break;
483 }
484 }
485 header->clSize = ((Pos - Buffer) + 7) >> 3;
486 TRACE("marshalled size %ld\n", header->clSize);
487 return Pos;
488}
489
490unsigned char * WINAPI VARIANT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, VARIANT *pvar)
491{
493 ULONG type_size;
494 int align;
495 unsigned char *Pos;
496
497 TRACE("%#lx, %p, %p.\n", *pFlags, Buffer, pvar);
498
500
502
503 Pos = (unsigned char*)(header + 1);
504 type_size = get_type_size(pFlags, header->vt);
505 align = get_type_alignment(pFlags, header->vt);
507
508 if(header->vt & VT_BYREF)
509 {
510 ULONG mem_size;
511 Pos += 4;
512
513 /* byref array needs to allocate a SAFEARRAY pointer */
514 if (header->vt & VT_ARRAY)
515 mem_size = sizeof(void *);
516 else switch (header->vt & ~VT_BYREF)
517 {
518 /* these types have a different memory size compared to wire size */
519 case VT_UNKNOWN:
520 case VT_DISPATCH:
521 case VT_BSTR:
522 mem_size = sizeof(void *);
523 break;
524 default:
525 mem_size = type_size;
526 break;
527 }
528
529 if (V_VT(pvar) != header->vt)
530 {
531 VariantClear(pvar);
532 V_BYREF(pvar) = CoTaskMemAlloc(mem_size);
533 memset(V_BYREF(pvar), 0, mem_size);
534 }
535 else if (!V_BYREF(pvar))
536 {
537 V_BYREF(pvar) = CoTaskMemAlloc(mem_size);
538 memset(V_BYREF(pvar), 0, mem_size);
539 }
540
541 if(!(header->vt & VT_ARRAY)
542 && (header->vt & VT_TYPEMASK) != VT_BSTR
543 && (header->vt & VT_TYPEMASK) != VT_VARIANT
544 && (header->vt & VT_TYPEMASK) != VT_UNKNOWN
545 && (header->vt & VT_TYPEMASK) != VT_DISPATCH
546 && (header->vt & VT_TYPEMASK) != VT_RECORD)
547 memcpy(V_BYREF(pvar), Pos, type_size);
548
549 if((header->vt & VT_TYPEMASK) != VT_VARIANT)
550 Pos += type_size;
551 else
552 Pos += 4;
553 }
554 else
555 {
556 VariantClear(pvar);
557 if(header->vt & VT_ARRAY)
558 V_ARRAY(pvar) = NULL;
559 else if((header->vt & VT_TYPEMASK) == VT_BSTR)
560 V_BSTR(pvar) = NULL;
561 else if((header->vt & VT_TYPEMASK) == VT_UNKNOWN)
562 V_UNKNOWN(pvar) = NULL;
563 else if((header->vt & VT_TYPEMASK) == VT_DISPATCH)
564 V_DISPATCH(pvar) = NULL;
565 else if((header->vt & VT_TYPEMASK) == VT_RECORD)
566 V_RECORD(pvar) = NULL;
567 else if((header->vt & VT_TYPEMASK) == VT_DECIMAL)
568 memcpy(pvar, Pos, type_size);
569 else
570 memcpy(&V_UI8(pvar), Pos, type_size);
571 Pos += type_size;
572 }
573
574 V_VT(pvar) = header->vt;
575#ifdef __REACTOS__
576 pvar->n1.n2.wReserved1 = header->wReserved1;
577 pvar->n1.n2.wReserved2 = header->wReserved2;
578 pvar->n1.n2.wReserved3 = header->wReserved3;
579#else
580 pvar->wReserved1 = header->wReserved1;
581 pvar->wReserved2 = header->wReserved2;
582 pvar->wReserved3 = header->wReserved3;
583#endif
584
585 if(header->vt & VT_ARRAY)
586 {
587 if(header->vt & VT_BYREF)
589 else
590 Pos = LPSAFEARRAY_UserUnmarshal(pFlags, Pos, &V_ARRAY(pvar));
591 }
592 else
593 {
594 switch (header->vt)
595 {
596 case VT_BSTR:
597 Pos = BSTR_UserUnmarshal(pFlags, Pos, &V_BSTR(pvar));
598 break;
599 case VT_BSTR | VT_BYREF:
600 Pos = BSTR_UserUnmarshal(pFlags, Pos, V_BSTRREF(pvar));
601 break;
602 case VT_VARIANT | VT_BYREF:
603 Pos = VARIANT_UserUnmarshal(pFlags, Pos, V_VARIANTREF(pvar));
604 break;
605 case VT_UNKNOWN:
607 break;
608 case VT_UNKNOWN | VT_BYREF:
610 break;
611 case VT_DISPATCH:
613 break;
614 case VT_DISPATCH | VT_BYREF:
616 break;
617 case VT_RECORD:
618 FIXME("handle BRECORD by val\n");
619 break;
620 case VT_RECORD | VT_BYREF:
621 FIXME("handle BRECORD by ref\n");
622 break;
623 }
624 }
625 return Pos;
626}
627
629{
630 VARTYPE vt = V_VT(pvar);
631 PVOID ref = NULL;
632
633 TRACE("%#lx, %p.\n", *pFlags, pvar);
634 TRACE("vt=%04x\n", V_VT(pvar));
635
636 if (vt & VT_BYREF) ref = V_BYREF(pvar);
637
638 VariantClear(pvar);
639 if (!ref) return;
640
641 if(vt & VT_ARRAY)
642 {
643 if (vt & VT_BYREF)
644 LPSAFEARRAY_UserFree(pFlags, V_ARRAYREF(pvar));
645 else
646 LPSAFEARRAY_UserFree(pFlags, &V_ARRAY(pvar));
647 }
648 else
649 {
650 switch (vt)
651 {
652 case VT_BSTR | VT_BYREF:
653 BSTR_UserFree(pFlags, V_BSTRREF(pvar));
654 break;
655 case VT_VARIANT | VT_BYREF:
656 VARIANT_UserFree(pFlags, V_VARIANTREF(pvar));
657 break;
658 case VT_RECORD | VT_BYREF:
659 FIXME("handle BRECORD by ref\n");
660 break;
661 case VT_UNKNOWN | VT_BYREF:
662 case VT_DISPATCH | VT_BYREF:
663 if (*V_UNKNOWNREF(pvar))
664 IUnknown_Release(*V_UNKNOWNREF(pvar));
665 break;
666 }
667 }
668
670}
671
672/* LPSAFEARRAY */
673
674/* Get the number of cells in a SafeArray */
676{
677 const SAFEARRAYBOUND* psab = psa->rgsabound;
678 USHORT cCount = psa->cDims;
679 ULONG ulNumCells = 1;
680
681 while (cCount--)
682 {
683 /* This is a valid bordercase. See testcases. -Marcus */
684 if (!psab->cElements)
685 return 0;
686 ulNumCells *= psab->cElements;
687 psab++;
688 }
689 return ulNumCells;
690}
691
692static inline SF_TYPE SAFEARRAY_GetUnionType(SAFEARRAY *psa)
693{
694 VARTYPE vt;
695 HRESULT hr;
696
698 if (FAILED(hr))
699 {
700 if(psa->fFeatures & FADF_VARIANT) return SF_VARIANT;
701
702 switch(psa->cbElements)
703 {
704 case 1: vt = VT_I1; break;
705 case 2: vt = VT_I2; break;
706 case 4: vt = VT_I4; break;
707 case 8: vt = VT_I8; break;
708 default:
710 }
711 }
712
713 if (psa->fFeatures & FADF_HAVEIID)
714 return SF_HAVEIID;
715
716 switch (vt)
717 {
718 case VT_I1:
719 case VT_UI1: return SF_I1;
720 case VT_BOOL:
721 case VT_I2:
722 case VT_UI2: return SF_I2;
723 case VT_INT:
724 case VT_UINT:
725 case VT_I4:
726 case VT_UI4:
727 case VT_R4: return SF_I4;
728 case VT_DATE:
729 case VT_CY:
730 case VT_R8:
731 case VT_I8:
732 case VT_UI8: return SF_I8;
733 case VT_INT_PTR:
734 case VT_UINT_PTR: return (sizeof(UINT_PTR) == 4 ? SF_I4 : SF_I8);
735 case VT_BSTR: return SF_BSTR;
736 case VT_DISPATCH: return SF_DISPATCH;
737 case VT_VARIANT: return SF_VARIANT;
738 case VT_UNKNOWN: return SF_UNKNOWN;
739 /* Note: Return a non-zero size to indicate vt is valid. The actual size
740 * of a UDT is taken from the result of IRecordInfo_GetSize().
741 */
742 case VT_RECORD: return SF_RECORD;
743 default: return SF_ERROR;
744 }
745}
746
747static DWORD elem_wire_size(LPSAFEARRAY lpsa, SF_TYPE sftype)
748{
749 switch (sftype)
750 {
751 case SF_BSTR:
752 case SF_HAVEIID:
753 case SF_UNKNOWN:
754 case SF_DISPATCH:
755 return sizeof(DWORD);
756
757 case SF_VARIANT:
758 return sizeof(variant_wire_t) - sizeof(DWORD);
759
760 default:
761 return lpsa->cbElements;
762 }
763}
764
765static DWORD elem_mem_size(wireSAFEARRAY wiresa, SF_TYPE sftype)
766{
767 switch (sftype)
768 {
769 case SF_HAVEIID:
770 case SF_UNKNOWN:
771 case SF_DISPATCH:
772 return sizeof(void *);
773
774 case SF_BSTR:
775 return sizeof(BSTR);
776
777 case SF_VARIANT:
778 return sizeof(VARIANT);
779
780 default:
781 return wiresa->cbElements;
782 }
783}
784
786{
787 ULONG size = StartingSize;
788
789 TRACE("("); dump_user_flags(pFlags); TRACE(", %ld, %p\n", StartingSize, *ppsa);
790
791 ALIGN_LENGTH(size, 3);
792 size += sizeof(ULONG);
793 if (*ppsa)
794 {
795 SAFEARRAY *psa = *ppsa;
796 ULONG ulCellCount = SAFEARRAY_GetCellCount(psa);
797 SF_TYPE sftype;
798 HRESULT hr;
799
800 size += sizeof(ULONG);
801 size += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
802
803 sftype = SAFEARRAY_GetUnionType(psa);
804 size += sizeof(ULONG);
805
806 size += sizeof(ULONG);
807 size += sizeof(ULONG);
808 if (sftype == SF_HAVEIID)
809 size += sizeof(IID);
810
811 size += sizeof(psa->rgsabound[0]) * psa->cDims;
812
813 size += sizeof(ULONG);
814
815 switch (sftype)
816 {
817 case SF_BSTR:
818 {
819 BSTR* lpBstr;
820
821 for (lpBstr = psa->pvData; ulCellCount; ulCellCount--, lpBstr++)
822 size = BSTR_UserSize(pFlags, size, lpBstr);
823
824 break;
825 }
826 case SF_DISPATCH:
827 case SF_UNKNOWN:
828 case SF_HAVEIID:
829 {
830 IUnknown **lpUnk;
831 GUID guid;
832
833 if (sftype == SF_HAVEIID)
835 else if (sftype == SF_UNKNOWN)
837 else
839
840 for (lpUnk = psa->pvData; ulCellCount; ulCellCount--, lpUnk++)
841 size = interface_user_size(pFlags, size, &guid, *lpUnk);
842
843 break;
844 }
845 case SF_VARIANT:
846 {
847 VARIANT* lpVariant;
848
849 for (lpVariant = psa->pvData; ulCellCount; ulCellCount--, lpVariant++)
850 size = VARIANT_UserSize(pFlags, size, lpVariant);
851
852 break;
853 }
854 case SF_RECORD:
855 {
856 IRecordInfo* pRecInfo = NULL;
857
858 hr = SafeArrayGetRecordInfo(psa, &pRecInfo);
859 if (FAILED(hr))
861
862 if (pRecInfo)
863 {
864 FIXME("size record info %p\n", pRecInfo);
865
866 IRecordInfo_Release(pRecInfo);
867 }
868 break;
869 }
870 case SF_I8:
871 ALIGN_LENGTH(size, 7);
872 /* fallthrough */
873 case SF_I1:
874 case SF_I2:
875 case SF_I4:
876 size += ulCellCount * psa->cbElements;
877 break;
878 default:
879 break;
880 }
881
882 }
883
884 return size;
885}
886
887unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buffer, LPSAFEARRAY *ppsa)
888{
889 HRESULT hr;
890
891 TRACE("("); dump_user_flags(pFlags); TRACE(", %p, &%p\n", Buffer, *ppsa);
892
894 *(ULONG *)Buffer = *ppsa ? 0x1 : 0x0;
895 Buffer += sizeof(ULONG);
896 if (*ppsa)
897 {
898 VARTYPE vt;
899 SAFEARRAY *psa = *ppsa;
900 ULONG ulCellCount = SAFEARRAY_GetCellCount(psa);
901 SAFEARRAYBOUND *bound;
902 SF_TYPE sftype;
903 GUID guid;
904 INT i;
905
906 sftype = SAFEARRAY_GetUnionType(psa);
907
908 *(ULONG *)Buffer = psa->cDims;
909 Buffer += sizeof(ULONG);
910 *(USHORT *)Buffer = psa->cDims;
911 Buffer += sizeof(USHORT);
912 *(USHORT *)Buffer = psa->fFeatures;
913 Buffer += sizeof(USHORT);
914 *(ULONG *)Buffer = elem_wire_size(psa, sftype);
915 Buffer += sizeof(ULONG);
916
918 if ((psa->fFeatures & FADF_HAVEIID) || FAILED(hr)) vt = 0;
919
920 *(ULONG *)Buffer = (USHORT)psa->cLocks | (vt << 16);
921 Buffer += sizeof(ULONG);
922
923 *(ULONG *)Buffer = sftype;
924 Buffer += sizeof(ULONG);
925
926 *(ULONG *)Buffer = ulCellCount;
927 Buffer += sizeof(ULONG);
928 *(ULONG *)Buffer = psa->pvData ? 0x2 : 0x0;
929 Buffer += sizeof(ULONG);
930 if (sftype == SF_HAVEIID)
931 {
933 memcpy(Buffer, &guid, sizeof(guid));
934 Buffer += sizeof(guid);
935 }
936
937 /* bounds are marshaled in opposite order comparing to storage layout */
938 bound = (SAFEARRAYBOUND*)Buffer;
939 for (i = 0; i < psa->cDims; i++)
940 {
941 memcpy(bound++, &psa->rgsabound[psa->cDims-i-1], sizeof(psa->rgsabound[0]));
942 }
943 Buffer += sizeof(psa->rgsabound[0]) * psa->cDims;
944
945 *(ULONG *)Buffer = ulCellCount;
946 Buffer += sizeof(ULONG);
947
948 if (psa->pvData)
949 {
950 switch (sftype)
951 {
952 case SF_BSTR:
953 {
954 BSTR* lpBstr;
955
956 for (lpBstr = psa->pvData; ulCellCount; ulCellCount--, lpBstr++)
957 Buffer = BSTR_UserMarshal(pFlags, Buffer, lpBstr);
958
959 break;
960 }
961 case SF_DISPATCH:
962 case SF_UNKNOWN:
963 case SF_HAVEIID:
964 {
965 IUnknown **lpUnk;
966 const GUID *iid;
967
968 if (sftype == SF_HAVEIID)
969 iid = &guid;
970 else if (sftype == SF_UNKNOWN)
971 iid = &IID_IUnknown;
972 else
973 iid = &IID_IDispatch;
974
975 for (lpUnk = psa->pvData; ulCellCount; ulCellCount--, lpUnk++)
976 Buffer = interface_user_marshal(pFlags, Buffer, iid, *lpUnk);
977
978 break;
979 }
980 case SF_VARIANT:
981 {
982 VARIANT* lpVariant;
983
984 for (lpVariant = psa->pvData; ulCellCount; ulCellCount--, lpVariant++)
985 Buffer = VARIANT_UserMarshal(pFlags, Buffer, lpVariant);
986
987 break;
988 }
989 case SF_RECORD:
990 {
991 IRecordInfo* pRecInfo = NULL;
992
993 hr = SafeArrayGetRecordInfo(psa, &pRecInfo);
994 if (FAILED(hr))
996
997 if (pRecInfo)
998 {
999 FIXME("write record info %p\n", pRecInfo);
1000
1001 IRecordInfo_Release(pRecInfo);
1002 }
1003 break;
1004 }
1005
1006 case SF_I8:
1008 /* fallthrough */
1009 case SF_I1:
1010 case SF_I2:
1011 case SF_I4:
1012 /* Just copy the data over */
1013 memcpy(Buffer, psa->pvData, ulCellCount * psa->cbElements);
1014 Buffer += ulCellCount * psa->cbElements;
1015 break;
1016 default:
1017 break;
1018 }
1019 }
1020
1021 }
1022 return Buffer;
1023}
1024
1025#define FADF_AUTOSETFLAGS (FADF_HAVEIID | FADF_RECORD | FADF_HAVEVARTYPE | \
1026 FADF_BSTR | FADF_UNKNOWN | FADF_DISPATCH | \
1027 FADF_VARIANT | FADF_CREATEVECTOR)
1028
1029unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, LPSAFEARRAY *ppsa)
1030{
1031 ULONG ptr;
1032 wireSAFEARRAY wiresa;
1033 ULONG cDims;
1034 HRESULT hr;
1035 SF_TYPE sftype;
1036 ULONG cell_count;
1037 GUID guid;
1038 VARTYPE vt;
1039 SAFEARRAYBOUND *wiresab;
1040
1041 TRACE("("); dump_user_flags(pFlags); TRACE(", %p, %p\n", Buffer, ppsa);
1042
1044 ptr = *(ULONG *)Buffer;
1045 Buffer += sizeof(ULONG);
1046
1047 if (!ptr)
1048 {
1049 SafeArrayDestroy(*ppsa);
1050 *ppsa = NULL;
1051
1052 TRACE("NULL safe array unmarshaled\n");
1053
1054 return Buffer;
1055 }
1056
1057 cDims = *(ULONG *)Buffer;
1058 Buffer += sizeof(ULONG);
1059
1060 wiresa = (wireSAFEARRAY)Buffer;
1061 Buffer += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
1062
1063 if (cDims != wiresa->cDims)
1065
1066 /* FIXME: there should be a limit on how large cDims can be */
1067
1068 vt = HIWORD(wiresa->cLocks);
1069
1070 sftype = *(ULONG *)Buffer;
1071 Buffer += sizeof(ULONG);
1072
1073 cell_count = *(ULONG *)Buffer;
1074 Buffer += sizeof(ULONG);
1075 ptr = *(ULONG *)Buffer;
1076 Buffer += sizeof(ULONG);
1077 if (sftype == SF_HAVEIID)
1078 {
1079 memcpy(&guid, Buffer, sizeof(guid));
1080 Buffer += sizeof(guid);
1081 }
1082
1083 wiresab = (SAFEARRAYBOUND *)Buffer;
1084 Buffer += sizeof(wiresab[0]) * wiresa->cDims;
1085
1086 if(*ppsa && (*ppsa)->cDims==wiresa->cDims)
1087 {
1088 if(((*ppsa)->fFeatures & ~FADF_AUTOSETFLAGS) != (wiresa->fFeatures & ~FADF_AUTOSETFLAGS))
1090
1091 if(SAFEARRAY_GetCellCount(*ppsa)*(*ppsa)->cbElements != cell_count*elem_mem_size(wiresa, sftype))
1092 {
1093 if((*ppsa)->fFeatures & (FADF_AUTO|FADF_STATIC|FADF_EMBEDDED|FADF_FIXEDSIZE))
1095
1096 hr = SafeArrayDestroyData(*ppsa);
1097 if(FAILED(hr))
1099 }
1100 memcpy((*ppsa)->rgsabound, wiresab, sizeof(*wiresab)*wiresa->cDims);
1101
1102 if((*ppsa)->fFeatures & FADF_HAVEVARTYPE)
1103 ((DWORD*)(*ppsa))[-1] = vt;
1104 }
1105 else if(vt)
1106 {
1107 SafeArrayDestroy(*ppsa);
1108 *ppsa = SafeArrayCreateEx(vt, wiresa->cDims, wiresab, NULL);
1109 if (!*ppsa) RpcRaiseException(E_OUTOFMEMORY);
1110 }
1111 else
1112 {
1113 SafeArrayDestroy(*ppsa);
1114 if (FAILED(SafeArrayAllocDescriptor(wiresa->cDims, ppsa)))
1116 memcpy((*ppsa)->rgsabound, wiresab, sizeof(SAFEARRAYBOUND) * wiresa->cDims);
1117 }
1118
1119 /* be careful about which flags we set since they could be a security
1120 * risk */
1121 (*ppsa)->fFeatures &= FADF_AUTOSETFLAGS;
1122 (*ppsa)->fFeatures |= (wiresa->fFeatures & ~(FADF_AUTOSETFLAGS));
1123 /* FIXME: there should be a limit on how large wiresa->cbElements can be */
1124 (*ppsa)->cbElements = elem_mem_size(wiresa, sftype);
1125
1126 /* SafeArrayCreateEx allocates the data for us, but
1127 * SafeArrayAllocDescriptor doesn't */
1128 if(!(*ppsa)->pvData)
1129 {
1130 hr = SafeArrayAllocData(*ppsa);
1131 if (FAILED(hr))
1133 }
1134
1135 if ((*(ULONG *)Buffer != cell_count) || (SAFEARRAY_GetCellCount(*ppsa) != cell_count))
1137 Buffer += sizeof(ULONG);
1138
1139 if (ptr)
1140 {
1141 switch (sftype)
1142 {
1143 case SF_BSTR:
1144 {
1145 BSTR* lpBstr;
1146
1147 for (lpBstr = (*ppsa)->pvData; cell_count; cell_count--, lpBstr++)
1148 Buffer = BSTR_UserUnmarshal(pFlags, Buffer, lpBstr);
1149
1150 break;
1151 }
1152 case SF_DISPATCH:
1153 case SF_UNKNOWN:
1154 case SF_HAVEIID:
1155 {
1156 IUnknown **lpUnk;
1157 const GUID *iid;
1158
1159 if (sftype == SF_HAVEIID)
1160 iid = &guid;
1161 else if (sftype == SF_UNKNOWN)
1162 iid = &IID_IUnknown;
1163 else
1164 iid = &IID_IDispatch;
1165
1166 for (lpUnk = (*ppsa)->pvData; cell_count; cell_count--, lpUnk++)
1167 Buffer = interface_user_unmarshal(pFlags, Buffer, iid, lpUnk);
1168
1169 break;
1170 }
1171 case SF_VARIANT:
1172 {
1173 VARIANT* lpVariant;
1174
1175 for (lpVariant = (*ppsa)->pvData; cell_count; cell_count--, lpVariant++)
1176 Buffer = VARIANT_UserUnmarshal(pFlags, Buffer, lpVariant);
1177
1178 break;
1179 }
1180 case SF_RECORD:
1181 {
1182 FIXME("set record info\n");
1183
1184 break;
1185 }
1186
1187 case SF_I8:
1189 /* fallthrough */
1190 case SF_I1:
1191 case SF_I2:
1192 case SF_I4:
1193 /* Just copy the data over */
1194 memcpy((*ppsa)->pvData, Buffer, cell_count * (*ppsa)->cbElements);
1195 Buffer += cell_count * (*ppsa)->cbElements;
1196 break;
1197 default:
1198 break;
1199 }
1200 }
1201
1202 TRACE("safe array unmarshaled: %p\n", *ppsa);
1203
1204 return Buffer;
1205}
1206
1208{
1209 TRACE("("); dump_user_flags(pFlags); TRACE(", &%p\n", *ppsa);
1210
1211 SafeArrayDestroy(*ppsa);
1212 *ppsa = NULL;
1213}
1214
1215
1216ULONG WINAPI HFONT_UserSize(ULONG *pFlags, ULONG Start, HFONT *phfont)
1217{
1218 FIXME(":stub\n");
1219 return 0;
1220}
1221
1222unsigned char * WINAPI HFONT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont)
1223{
1224 FIXME(":stub\n");
1225 return NULL;
1226}
1227
1228unsigned char * WINAPI HFONT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont)
1229{
1230 FIXME(":stub\n");
1231 return NULL;
1232}
1233
1234void WINAPI HFONT_UserFree(ULONG *pFlags, HFONT *phfont)
1235{
1236 FIXME(":stub\n");
1237 return;
1238}
1239
1240
1241/* IDispatch */
1242/* exactly how Invoke is marshalled is not very clear to me yet,
1243 * but the way I've done it seems to work for me */
1244
1246 IDispatch* This,
1247 DISPID dispIdMember,
1248 REFIID riid,
1249 LCID lcid,
1250 WORD wFlags,
1251 DISPPARAMS* pDispParams,
1252 VARIANT* pVarResult,
1253 EXCEPINFO* pExcepInfo,
1254 UINT* puArgErr)
1255{
1256 HRESULT hr;
1257 VARIANT VarResult;
1258 UINT* rgVarRefIdx = NULL;
1259 VARIANTARG* rgVarRef = NULL;
1260 UINT u, cVarRef;
1261 UINT uArgErr;
1262 EXCEPINFO ExcepInfo;
1263
1264 TRACE("%p, %ld, %s, %#lx, %x, %p, %p, %p, %p.\n", This,
1265 dispIdMember, debugstr_guid(riid),
1266 lcid, wFlags, pDispParams, pVarResult,
1267 pExcepInfo, puArgErr);
1268
1269 /* [out] args can't be null, use dummy vars if needed */
1270 if (!pVarResult) pVarResult = &VarResult;
1271 if (!puArgErr) puArgErr = &uArgErr;
1272 if (!pExcepInfo) pExcepInfo = &ExcepInfo;
1273
1274 /* count by-ref args */
1275 for (cVarRef=0,u=0; u<pDispParams->cArgs; u++) {
1276 VARIANTARG* arg = &pDispParams->rgvarg[u];
1277 if (V_ISBYREF(arg)) {
1278 cVarRef++;
1279 }
1280 }
1281 if (cVarRef) {
1282 rgVarRefIdx = CoTaskMemAlloc(sizeof(UINT)*cVarRef);
1283 rgVarRef = CoTaskMemAlloc(sizeof(VARIANTARG)*cVarRef);
1284 /* make list of by-ref args */
1285 for (cVarRef=0,u=0; u<pDispParams->cArgs; u++) {
1286 VARIANTARG* arg = &pDispParams->rgvarg[u];
1287 if (V_ISBYREF(arg)) {
1288 rgVarRefIdx[cVarRef] = u;
1289 VariantInit(&rgVarRef[cVarRef]);
1290 VariantCopy(&rgVarRef[cVarRef], arg);
1292 cVarRef++;
1293 }
1294 }
1295 } else {
1296 /* [out] args still can't be null,
1297 * but we can point these anywhere in this case,
1298 * since they won't be written to when cVarRef is 0 */
1299 rgVarRefIdx = puArgErr;
1300 rgVarRef = pVarResult;
1301 }
1302 TRACE("passed by ref: %d args\n", cVarRef);
1303 hr = IDispatch_RemoteInvoke_Proxy(This,
1304 dispIdMember,
1305 riid,
1306 lcid,
1307 wFlags,
1308 pDispParams,
1309 pVarResult,
1310 pExcepInfo,
1311 puArgErr,
1312 cVarRef,
1313 rgVarRefIdx,
1314 rgVarRef);
1315 if (cVarRef) {
1316 for (u=0; u<cVarRef; u++) {
1317 unsigned i = rgVarRefIdx[u];
1318 VariantCopy(&pDispParams->rgvarg[i],
1319 &rgVarRef[u]);
1320 VariantClear(&rgVarRef[u]);
1321 }
1322 CoTaskMemFree(rgVarRef);
1323 CoTaskMemFree(rgVarRefIdx);
1324 }
1325
1326 if(pExcepInfo == &ExcepInfo)
1327 {
1328 SysFreeString(pExcepInfo->bstrSource);
1329 SysFreeString(pExcepInfo->bstrDescription);
1330 SysFreeString(pExcepInfo->bstrHelpFile);
1331 }
1332 return hr;
1333}
1334
1336 IDispatch* This,
1337 DISPID dispIdMember,
1338 REFIID riid,
1339 LCID lcid,
1340 DWORD dwFlags,
1341 DISPPARAMS* pDispParams,
1342 VARIANT* pVarResult,
1343 EXCEPINFO* pExcepInfo,
1344 UINT* pArgErr,
1345 UINT cVarRef,
1346 UINT* rgVarRefIdx,
1347 VARIANTARG* rgVarRef)
1348{
1349 HRESULT hr = S_OK;
1350 VARIANTARG *rgvarg, *arg;
1351 UINT u;
1352
1353 /* initialize out parameters, so that they can be marshalled
1354 * in case the real Invoke doesn't initialize them */
1355 VariantInit(pVarResult);
1356 memset(pExcepInfo, 0, sizeof(*pExcepInfo));
1357 *pArgErr = 0;
1358
1359 /* let the real Invoke operate on a copy of the in parameters,
1360 * so we don't risk losing pointers to allocated memory */
1361 rgvarg = pDispParams->rgvarg;
1362 arg = CoTaskMemAlloc(sizeof(VARIANTARG)*pDispParams->cArgs);
1363 if (!arg) return E_OUTOFMEMORY;
1364
1365 /* init all args so we can call VariantClear on all the args if the copy
1366 * below fails */
1367 for (u = 0; u < pDispParams->cArgs; u++)
1368 VariantInit(&arg[u]);
1369
1370 for (u = 0; u < pDispParams->cArgs; u++) {
1371 hr = VariantCopy(&arg[u], &rgvarg[u]);
1372 if (FAILED(hr))
1373 break;
1374 }
1375
1376 if (SUCCEEDED(hr)) {
1377 /* copy ref args to arg array */
1378 for (u=0; u<cVarRef; u++) {
1379 unsigned i = rgVarRefIdx[u];
1380 VariantCopy(&arg[i], &rgVarRef[u]);
1381 }
1382
1383 pDispParams->rgvarg = arg;
1384
1385 hr = IDispatch_Invoke(This,
1386 dispIdMember,
1387 riid,
1388 lcid,
1389 dwFlags,
1390 pDispParams,
1391 pVarResult,
1392 pExcepInfo,
1393 pArgErr);
1394
1395 /* copy ref args from arg array */
1396 for (u=0; u<cVarRef; u++) {
1397 unsigned i = rgVarRefIdx[u];
1398 VariantCopy(&rgVarRef[u], &arg[i]);
1399 }
1400 }
1401
1402 /* clear the duplicate argument list */
1403 for (u=0; u<pDispParams->cArgs; u++)
1404 VariantClear(&arg[u]);
1405
1406 pDispParams->rgvarg = rgvarg;
1408
1409 return hr;
1410}
1411
1412/* IEnumVARIANT */
1413
1416 ULONG celt,
1417 VARIANT* rgVar,
1418 ULONG* pCeltFetched)
1419{
1420 ULONG fetched;
1421 if (!pCeltFetched)
1422 pCeltFetched = &fetched;
1423 return IEnumVARIANT_RemoteNext_Proxy(This,
1424 celt,
1425 rgVar,
1426 pCeltFetched);
1427}
1428
1431 ULONG celt,
1432 VARIANT* rgVar,
1433 ULONG* pCeltFetched)
1434{
1435 HRESULT hr;
1436 *pCeltFetched = 0;
1437 hr = IEnumVARIANT_Next(This,
1438 celt,
1439 rgVar,
1440 pCeltFetched);
1441 if (hr == S_OK) *pCeltFetched = celt;
1442 return hr;
1443}
1444
1445/* TypeInfo related freers */
1446
1447static void free_embedded_typedesc(TYPEDESC *tdesc);
1448static void free_embedded_arraydesc(ARRAYDESC *adesc)
1449{
1450 switch(adesc->tdescElem.vt)
1451 {
1452 case VT_PTR:
1453 case VT_SAFEARRAY:
1454 free_embedded_typedesc(adesc->tdescElem.lptdesc);
1455 CoTaskMemFree(adesc->tdescElem.lptdesc);
1456 break;
1457 case VT_CARRAY:
1458 free_embedded_arraydesc(adesc->tdescElem.lpadesc);
1459 CoTaskMemFree(adesc->tdescElem.lpadesc);
1460 break;
1461 }
1462}
1463
1464static void free_embedded_typedesc(TYPEDESC *tdesc)
1465{
1466 switch(tdesc->vt)
1467 {
1468 case VT_PTR:
1469 case VT_SAFEARRAY:
1470 free_embedded_typedesc(tdesc->lptdesc);
1471 CoTaskMemFree(tdesc->lptdesc);
1472 break;
1473 case VT_CARRAY:
1474 free_embedded_arraydesc(tdesc->lpadesc);
1475 CoTaskMemFree(tdesc->lpadesc);
1476 break;
1477 }
1478}
1479
1480static void free_embedded_elemdesc(ELEMDESC *edesc)
1481{
1482 free_embedded_typedesc(&edesc->tdesc);
1483 if(edesc->paramdesc.wParamFlags & PARAMFLAG_FHASDEFAULT)
1484 CoTaskMemFree(edesc->paramdesc.pparamdescex);
1485}
1486
1487/* ITypeComp */
1488
1490 ITypeComp* This,
1491 LPOLESTR name,
1492 ULONG lHashVal,
1493 WORD flags,
1494 ITypeInfo **ti,
1495 DESCKIND *desckind,
1496 BINDPTR *bindptr)
1497{
1498 CLEANLOCALSTORAGE stg = { 0 };
1499 ITypeComp *typecomp;
1500 FUNCDESC *funcdesc;
1501 VARDESC *vardesc;
1502 HRESULT hr;
1503
1504 TRACE("%p, %s, %#lx, %#x, %p, %p, %p.\n", This, debugstr_w(name), lHashVal, flags, ti,
1505 desckind, bindptr);
1506
1507 *desckind = DESCKIND_NONE;
1508 memset(bindptr, 0, sizeof(*bindptr));
1509
1510 hr = ITypeComp_RemoteBind_Proxy(This, name, lHashVal, flags, ti, desckind,
1511 &funcdesc, &vardesc, &typecomp, &stg);
1512
1513 if (hr == S_OK)
1514 {
1515 switch (*desckind)
1516 {
1517 case DESCKIND_FUNCDESC:
1518 bindptr->lpfuncdesc = funcdesc;
1519 break;
1520 case DESCKIND_VARDESC:
1521 case DESCKIND_IMPLICITAPPOBJ:
1522 bindptr->lpvardesc = vardesc;
1523 break;
1524 case DESCKIND_TYPECOMP:
1525 bindptr->lptcomp = typecomp;
1526 break;
1527 default:
1528 ;
1529 }
1530 }
1531
1532 return hr;
1533}
1534
1536 ITypeComp* This,
1537 LPOLESTR name,
1538 ULONG lHashVal,
1539 WORD flags,
1540 ITypeInfo **ti,
1541 DESCKIND *desckind,
1542 FUNCDESC **funcdesc,
1543 VARDESC **vardesc,
1544 ITypeComp **typecomp,
1545 CLEANLOCALSTORAGE *stg)
1546{
1547 BINDPTR bindptr;
1548 HRESULT hr;
1549
1550 TRACE("%p, %s, %#lx, %#x, %p, %p, %p, %p, %p, %p.\n", This, debugstr_w(name),
1551 lHashVal, flags, ti, desckind, funcdesc, vardesc, typecomp, stg);
1552
1553 memset(stg, 0, sizeof(*stg));
1554 memset(&bindptr, 0, sizeof(bindptr));
1555
1556 *funcdesc = NULL;
1557 *vardesc = NULL;
1558 *typecomp = NULL;
1559 *ti = NULL;
1560
1561 hr = ITypeComp_Bind(This, name, lHashVal, flags, ti, desckind, &bindptr);
1562 if(hr != S_OK)
1563 return hr;
1564
1565 switch (*desckind)
1566 {
1567 case DESCKIND_FUNCDESC:
1568 *funcdesc = bindptr.lpfuncdesc;
1569 stg->pInterface = (IUnknown*)*ti;
1570 stg->pStorage = funcdesc;
1571 stg->flags = CLS_FUNCDESC;
1572 break;
1573 case DESCKIND_VARDESC:
1574 case DESCKIND_IMPLICITAPPOBJ:
1575 *vardesc = bindptr.lpvardesc;
1576 stg->pInterface = (IUnknown*)*ti;
1577 stg->pStorage = vardesc;
1578 stg->flags = CLS_VARDESC;
1579 break;
1580 case DESCKIND_TYPECOMP:
1581 *typecomp = bindptr.lptcomp;
1582 break;
1583 default:
1584 ;
1585 }
1586
1587 if (stg->pInterface)
1588 IUnknown_AddRef(stg->pInterface);
1589
1590 return hr;
1591}
1592
1594 ITypeComp* This,
1595 LPOLESTR name,
1596 ULONG lHashVal,
1597 ITypeInfo **ti,
1598 ITypeComp **typecomp)
1599{
1600 HRESULT hr;
1601
1602 TRACE("%p, %s, %#lx, %p, %p.\n", This, debugstr_w(name), lHashVal, ti, typecomp);
1603
1604 hr = ITypeComp_RemoteBindType_Proxy(This, name, lHashVal, ti);
1605 if (hr == S_OK)
1606 ITypeInfo_GetTypeComp(*ti, typecomp);
1607 else if (typecomp)
1608 *typecomp = NULL;
1609
1610 return hr;
1611}
1612
1614 ITypeComp* This,
1615 LPOLESTR name,
1616 ULONG lHashVal,
1617 ITypeInfo **ti)
1618{
1619 ITypeComp *typecomp = NULL;
1620 HRESULT hr;
1621
1622 TRACE("%p, %s, %#lx, %p.\n", This, debugstr_w(name), lHashVal, ti);
1623
1624 hr = ITypeComp_BindType(This, name, lHashVal, ti, &typecomp);
1625
1626 if (typecomp)
1627 ITypeComp_Release(typecomp);
1628
1629 return hr;
1630}
1631
1632/* ITypeInfo */
1633
1635 ITypeInfo* This,
1636 TYPEATTR** ppTypeAttr)
1637
1638{
1639 CLEANLOCALSTORAGE stg;
1640 TRACE("(%p, %p)\n", This, ppTypeAttr);
1641
1642 stg.flags = 0;
1643 stg.pStorage = NULL;
1644 stg.pInterface = NULL;
1645
1646 return ITypeInfo_RemoteGetTypeAttr_Proxy(This, ppTypeAttr, &stg);
1647}
1648
1650 ITypeInfo* This,
1651 LPTYPEATTR* ppTypeAttr,
1652 CLEANLOCALSTORAGE* pDummy)
1653{
1654 HRESULT hr;
1655 TRACE("(%p, %p)\n", This, ppTypeAttr);
1656
1657 hr = ITypeInfo_GetTypeAttr(This, ppTypeAttr);
1658 if(hr != S_OK)
1659 return hr;
1660
1661 pDummy->flags = CLS_TYPEATTR;
1662 ITypeInfo_AddRef(This);
1663 pDummy->pInterface = (IUnknown*)This;
1664 pDummy->pStorage = ppTypeAttr;
1665 return hr;
1666}
1667
1669 ITypeInfo* This,
1670 UINT index,
1671 FUNCDESC** ppFuncDesc)
1672{
1673 CLEANLOCALSTORAGE stg;
1674 TRACE("(%p, %d, %p)\n", This, index, ppFuncDesc);
1675
1676 stg.flags = 0;
1677 stg.pStorage = NULL;
1678 stg.pInterface = NULL;
1679
1680 return ITypeInfo_RemoteGetFuncDesc_Proxy(This, index, ppFuncDesc, &stg);
1681}
1682
1684 ITypeInfo* This,
1685 UINT index,
1686 LPFUNCDESC* ppFuncDesc,
1687 CLEANLOCALSTORAGE* pDummy)
1688{
1689 HRESULT hr;
1690 TRACE("(%p, %d, %p)\n", This, index, ppFuncDesc);
1691
1692 hr = ITypeInfo_GetFuncDesc(This, index, ppFuncDesc);
1693 if(hr != S_OK)
1694 return hr;
1695
1696 pDummy->flags = CLS_FUNCDESC;
1697 ITypeInfo_AddRef(This);
1698 pDummy->pInterface = (IUnknown*)This;
1699 pDummy->pStorage = ppFuncDesc;
1700 return hr;
1701}
1702
1704 ITypeInfo* This,
1705 UINT index,
1706 VARDESC** ppVarDesc)
1707{
1708 CLEANLOCALSTORAGE stg;
1709 TRACE("(%p, %d, %p)\n", This, index, ppVarDesc);
1710
1711 stg.flags = 0;
1712 stg.pStorage = NULL;
1713 stg.pInterface = NULL;
1714
1715 return ITypeInfo_RemoteGetVarDesc_Proxy(This, index, ppVarDesc, &stg);
1716}
1717
1719 ITypeInfo* This,
1720 UINT index,
1721 LPVARDESC* ppVarDesc,
1722 CLEANLOCALSTORAGE* pDummy)
1723{
1724 HRESULT hr;
1725 TRACE("(%p, %d, %p)\n", This, index, ppVarDesc);
1726
1727 hr = ITypeInfo_GetVarDesc(This, index, ppVarDesc);
1728 if(hr != S_OK)
1729 return hr;
1730
1731 pDummy->flags = CLS_VARDESC;
1732 ITypeInfo_AddRef(This);
1733 pDummy->pInterface = (IUnknown*)This;
1734 pDummy->pStorage = ppVarDesc;
1735 return hr;
1736}
1737
1739 ITypeInfo* This,
1740 MEMBERID memid,
1741 BSTR* rgBstrNames,
1742 UINT cMaxNames,
1743 UINT* pcNames)
1744{
1745 TRACE("%p, %#lx, %p, %d, %p.\n", This, memid, rgBstrNames, cMaxNames, pcNames);
1746
1747 return ITypeInfo_RemoteGetNames_Proxy(This, memid, rgBstrNames, cMaxNames, pcNames);
1748}
1749
1751 ITypeInfo* This,
1752 MEMBERID memid,
1753 BSTR* rgBstrNames,
1754 UINT cMaxNames,
1755 UINT* pcNames)
1756{
1757 TRACE("%p, %#lx, %p, %d, %p.\n", This, memid, rgBstrNames, cMaxNames, pcNames);
1758
1759 return ITypeInfo_GetNames(This, memid, rgBstrNames, cMaxNames, pcNames);
1760}
1761
1763 ITypeInfo* This,
1764 LPOLESTR* rgszNames,
1765 UINT cNames,
1766 MEMBERID* pMemId)
1767{
1768 FIXME("not implemented\n");
1769 return E_FAIL;
1770}
1771
1773 ITypeInfo* This)
1774{
1775 FIXME("not implemented\n");
1776 return E_FAIL;
1777}
1778
1780 ITypeInfo* This,
1781 PVOID pvInstance,
1782 MEMBERID memid,
1783 WORD wFlags,
1784 DISPPARAMS* pDispParams,
1785 VARIANT* pVarResult,
1786 EXCEPINFO* pExcepInfo,
1787 UINT* puArgErr)
1788{
1789 FIXME("not implemented\n");
1790 return E_FAIL;
1791}
1792
1794 ITypeInfo* This)
1795{
1796 FIXME("not implemented\n");
1797 return E_FAIL;
1798}
1799
1801 BSTR *name, BSTR *doc_string,
1802 DWORD *help_context, BSTR *help_file)
1803{
1804 DWORD dummy_help_context, flags = 0;
1805 BSTR dummy_name, dummy_doc_string, dummy_help_file;
1806 HRESULT hr;
1807
1808 TRACE("%p, %#lx, %p, %p, %p, %p.\n", This, memid, name, doc_string, help_context, help_file);
1809
1810 if(!name) name = &dummy_name;
1811 else flags = 1;
1812
1813 if(!doc_string) doc_string = &dummy_doc_string;
1814 else flags |= 2;
1815
1816 if(!help_context) help_context = &dummy_help_context;
1817 else flags |= 4;
1818
1819 if(!help_file) help_file = &dummy_help_file;
1820 else flags |= 8;
1821
1822 hr = ITypeInfo_RemoteGetDocumentation_Proxy(This, memid, flags, name, doc_string, help_context, help_file);
1823
1824 /* We don't need to free the dummy BSTRs since the stub ensures that these will be NULLs. */
1825
1826 return hr;
1827}
1828
1830 DWORD flags, BSTR *name, BSTR *doc_string,
1831 DWORD *help_context, BSTR *help_file)
1832{
1833 TRACE("%p, %#lx, %#lx, %p, %p, %p, %p.\n", This, memid, flags, name, doc_string, help_context, help_file);
1834
1835 *name = *doc_string = *help_file = NULL;
1836 *help_context = 0;
1837
1838 if(!(flags & 1)) name = NULL;
1839 if(!(flags & 2)) doc_string = NULL;
1840 if(!(flags & 4)) help_context = NULL;
1841 if(!(flags & 8)) help_file = NULL;
1842
1843 return ITypeInfo_GetDocumentation(This, memid, name, doc_string, help_context, help_file);
1844}
1845
1847 INVOKEKIND invkind, BSTR *dll_name,
1848 BSTR* name, WORD *ordinal)
1849{
1850 DWORD flags = 0;
1851 BSTR dummy_dll_name, dummy_name;
1852 WORD dummy_ordinal;
1853 HRESULT hr;
1854
1855 TRACE("%p, %#lx, %#x, %p, %p, %p.\n", This, memid, invkind, dll_name, name, ordinal);
1856
1857 if(!dll_name) dll_name = &dummy_dll_name;
1858 else flags = 1;
1859
1860 if(!name) name = &dummy_name;
1861 else flags |= 2;
1862
1863 if(!ordinal) ordinal = &dummy_ordinal;
1864 else flags |= 4;
1865
1866 hr = ITypeInfo_RemoteGetDllEntry_Proxy(This, memid, invkind, flags, dll_name, name, ordinal);
1867
1868 /* We don't need to free the dummy BSTRs since the stub ensures that these will be NULLs. */
1869
1870 return hr;
1871}
1872
1874 INVOKEKIND invkind, DWORD flags,
1875 BSTR *dll_name, BSTR *name,
1876 WORD *ordinal)
1877{
1878 TRACE("%p, %#lx, %x, %p, %p, %p.\n", This, memid, invkind, dll_name, name, ordinal);
1879
1880 *dll_name = *name = NULL;
1881 *ordinal = 0;
1882
1883 if(!(flags & 1)) dll_name = NULL;
1884 if(!(flags & 2)) name = NULL;
1885 if(!(flags & 4)) ordinal = NULL;
1886
1887 return ITypeInfo_GetDllEntry(This, memid, invkind, dll_name, name, ordinal);
1888}
1889
1891 ITypeInfo* This,
1892 MEMBERID memid,
1893 INVOKEKIND invKind,
1894 PVOID* ppv)
1895{
1896 FIXME("not implemented\n");
1897 return E_FAIL;
1898}
1899
1901 ITypeInfo* This)
1902{
1903 FIXME("not implemented\n");
1904 return E_FAIL;
1905}
1906
1908 ITypeInfo* This,
1909 IUnknown* pUnkOuter,
1910 REFIID riid,
1911 PVOID* ppvObj)
1912{
1913 FIXME("not implemented\n");
1914 return E_FAIL;
1915}
1916
1918 ITypeInfo* This,
1919 REFIID riid,
1920 IUnknown** ppvObj)
1921{
1922 FIXME("not implemented\n");
1923 return E_FAIL;
1924}
1925
1927 ITypeInfo* This,
1928 ITypeLib** ppTLib,
1929 UINT* pIndex)
1930{
1931 ITypeLib *pTL;
1932 UINT index;
1933 HRESULT hr;
1934
1935 TRACE("(%p, %p, %p)\n", This, ppTLib, pIndex );
1936
1937 hr = ITypeInfo_RemoteGetContainingTypeLib_Proxy(This, &pTL, &index);
1938 if(SUCCEEDED(hr))
1939 {
1940 if(pIndex)
1941 *pIndex = index;
1942
1943 if(ppTLib)
1944 *ppTLib = pTL;
1945 else
1946 ITypeLib_Release(pTL);
1947 }
1948 return hr;
1949}
1950
1952 ITypeInfo* This,
1953 ITypeLib** ppTLib,
1954 UINT* pIndex)
1955{
1956 TRACE("(%p, %p, %p)\n", This, ppTLib, pIndex );
1957 return ITypeInfo_GetContainingTypeLib(This, ppTLib, pIndex);
1958}
1959
1961 ITypeInfo* This,
1962 TYPEATTR* pTypeAttr)
1963{
1964 TRACE("(%p, %p)\n", This, pTypeAttr);
1965 free_embedded_typedesc(&pTypeAttr->tdescAlias);
1966 CoTaskMemFree(pTypeAttr);
1967}
1968
1970 ITypeInfo* This)
1971{
1972 TRACE("nothing to do\n");
1973 return S_OK;
1974}
1975
1977 ITypeInfo* This,
1978 FUNCDESC* pFuncDesc)
1979{
1980 SHORT param;
1981 TRACE("(%p, %p)\n", This, pFuncDesc);
1982
1983 for(param = 0; param < pFuncDesc->cParams; param++)
1984 free_embedded_elemdesc(pFuncDesc->lprgelemdescParam + param);
1985 if(param)
1986 CoTaskMemFree(pFuncDesc->lprgelemdescParam);
1987
1988 free_embedded_elemdesc(&pFuncDesc->elemdescFunc);
1989
1990 if(pFuncDesc->cScodes != 0 && pFuncDesc->cScodes != -1)
1991 CoTaskMemFree(pFuncDesc->lprgscode);
1992
1993 CoTaskMemFree(pFuncDesc);
1994}
1995
1997 ITypeInfo* This)
1998{
1999 TRACE("nothing to do\n");
2000 return S_OK;
2001}
2002
2004 ITypeInfo* This,
2005 VARDESC* pVarDesc)
2006{
2007 TRACE("(%p, %p)\n", This, pVarDesc);
2008
2009 CoTaskMemFree(pVarDesc->lpstrSchema);
2010
2011 if(pVarDesc->varkind == VAR_CONST)
2012 CoTaskMemFree(pVarDesc->lpvarValue);
2013
2014 free_embedded_elemdesc(&pVarDesc->elemdescVar);
2015 CoTaskMemFree(pVarDesc);
2016}
2017
2019 ITypeInfo* This)
2020{
2021 TRACE("nothing to do\n");
2022 return S_OK;
2023}
2024
2025
2026/* ITypeInfo2 */
2027
2029 LCID lcid, BSTR *help_string,
2030 DWORD *help_context, BSTR *help_dll)
2031{
2032 DWORD dummy_help_context, flags = 0;
2033 BSTR dummy_help_string, dummy_help_dll;
2034 HRESULT hr;
2035
2036 TRACE("%p, %#lx, %#lx, %p, %p, %p.\n", This, memid, lcid, help_string, help_context, help_dll);
2037
2038 if(!help_string) help_string = &dummy_help_string;
2039 else flags = 1;
2040
2041 if(!help_context) help_context = &dummy_help_context;
2042 else flags |= 2;
2043
2044 if(!help_dll) help_dll = &dummy_help_dll;
2045 else flags |= 4;
2046
2047 hr = ITypeInfo2_RemoteGetDocumentation2_Proxy(This, memid, lcid, flags, help_string, help_context, help_dll);
2048
2049 /* We don't need to free the dummy BSTRs since the stub ensures that these will be NULLs. */
2050
2051 return hr;
2052}
2053
2056 BSTR *help_string, DWORD *help_context,
2057 BSTR *help_dll)
2058{
2059 TRACE("%p, %#lx, %#lx, %#lx, %p, %p, %p.\n", This, memid, lcid, flags, help_string, help_context, help_dll);
2060
2061 *help_string = *help_dll = NULL;
2062 *help_context = 0;
2063
2064 if(!(flags & 1)) help_string = NULL;
2065 if(!(flags & 2)) help_context = NULL;
2066 if(!(flags & 4)) help_dll = NULL;
2067
2068 return ITypeInfo2_GetDocumentation2(This, memid, lcid, help_string, help_context, help_dll);
2069}
2070
2071/* ITypeLib */
2072
2074 ITypeLib* This)
2075{
2076 UINT count = 0;
2077 TRACE("(%p)\n", This);
2078
2079 ITypeLib_RemoteGetTypeInfoCount_Proxy(This, &count);
2080
2081 return count;
2082}
2083
2085 ITypeLib* This,
2086 UINT* pcTInfo)
2087{
2088 TRACE("(%p, %p)\n", This, pcTInfo);
2089 *pcTInfo = ITypeLib_GetTypeInfoCount(This);
2090 return S_OK;
2091}
2092
2094 ITypeLib* This,
2095 TLIBATTR** ppTLibAttr)
2096{
2097 CLEANLOCALSTORAGE stg;
2098 TRACE("(%p, %p)\n", This, ppTLibAttr);
2099
2100 stg.flags = 0;
2101 stg.pStorage = NULL;
2102 stg.pInterface = NULL;
2103
2104 return ITypeLib_RemoteGetLibAttr_Proxy(This, ppTLibAttr, &stg);
2105}
2106
2108 ITypeLib* This,
2109 LPTLIBATTR* ppTLibAttr,
2110 CLEANLOCALSTORAGE* pDummy)
2111{
2112 HRESULT hr;
2113 TRACE("(%p, %p)\n", This, ppTLibAttr);
2114
2115 hr = ITypeLib_GetLibAttr(This, ppTLibAttr);
2116 if(hr != S_OK)
2117 return hr;
2118
2119 pDummy->flags = CLS_LIBATTR;
2120 ITypeLib_AddRef(This);
2121 pDummy->pInterface = (IUnknown*)This;
2122 pDummy->pStorage = ppTLibAttr;
2123 return hr;
2124}
2125
2127 BSTR *doc_string, DWORD *help_context,
2128 BSTR *help_file)
2129{
2130 DWORD dummy_help_context, flags = 0;
2131 BSTR dummy_name, dummy_doc_string, dummy_help_file;
2132 HRESULT hr;
2133 TRACE("(%p, %d, %p, %p, %p, %p)\n", This, index, name, doc_string, help_context, help_file);
2134
2135 if(!name) name = &dummy_name;
2136 else flags = 1;
2137
2138 if(!doc_string) doc_string = &dummy_doc_string;
2139 else flags |= 2;
2140
2141 if(!help_context) help_context = &dummy_help_context;
2142 else flags |= 4;
2143
2144 if(!help_file) help_file = &dummy_help_file;
2145 else flags |= 8;
2146
2147 hr = ITypeLib_RemoteGetDocumentation_Proxy(This, index, flags, name, doc_string, help_context, help_file);
2148
2149 /* We don't need to free the dummy BSTRs since the stub ensures that these will be NULLs. */
2150
2151 return hr;
2152}
2153
2155 BSTR *name, BSTR *doc_string,
2156 DWORD *help_context, BSTR *help_file)
2157{
2158 TRACE("%p, %d, %#lx, %p, %p, %p, %p.\n", This, index, flags, name, doc_string, help_context, help_file);
2159
2160 *name = *doc_string = *help_file = NULL;
2161 *help_context = 0;
2162
2163 if(!(flags & 1)) name = NULL;
2164 if(!(flags & 2)) doc_string = NULL;
2165 if(!(flags & 4)) help_context = NULL;
2166 if(!(flags & 8)) help_file = NULL;
2167
2168 return ITypeLib_GetDocumentation(This, index, name, doc_string, help_context, help_file);
2169}
2170
2172 ITypeLib* This,
2173 LPOLESTR szNameBuf,
2174 ULONG lHashVal,
2175 BOOL* pfName)
2176{
2177 FIXME("not implemented\n");
2178 return E_FAIL;
2179}
2180
2182 ITypeLib* This,
2183 LPOLESTR szNameBuf,
2184 ULONG lHashVal,
2185 BOOL* pfName,
2186 BSTR* pBstrLibName)
2187{
2188 FIXME("not implemented\n");
2189 return E_FAIL;
2190}
2191
2193 ITypeLib* This,
2194 LPOLESTR szNameBuf,
2195 ULONG lHashVal,
2196 ITypeInfo** ppTInfo,
2197 MEMBERID* rgMemId,
2198 USHORT* pcFound)
2199{
2200 FIXME("not implemented\n");
2201 return E_FAIL;
2202}
2203
2205 ITypeLib* This,
2206 LPOLESTR szNameBuf,
2207 ULONG lHashVal,
2208 ITypeInfo** ppTInfo,
2209 MEMBERID* rgMemId,
2210 USHORT* pcFound,
2211 BSTR* pBstrLibName)
2212{
2213 FIXME("not implemented\n");
2214 return E_FAIL;
2215}
2216
2218 ITypeLib* This,
2219 TLIBATTR* pTLibAttr)
2220{
2221 TRACE("(%p, %p)\n", This, pTLibAttr);
2222 CoTaskMemFree(pTLibAttr);
2223}
2224
2226 ITypeLib* This)
2227{
2228 TRACE("nothing to do\n");
2229 return S_OK;
2230}
2231
2232
2233/* ITypeLib2 */
2234
2236 ITypeLib2* This,
2237 ULONG* pcUniqueNames,
2238 ULONG* pcchUniqueNames)
2239{
2240 FIXME("not implemented\n");
2241 return E_FAIL;
2242}
2243
2245 ITypeLib2* This,
2246 ULONG* pcUniqueNames,
2247 ULONG* pcchUniqueNames)
2248{
2249 FIXME("not implemented\n");
2250 return E_FAIL;
2251}
2252
2254 LCID lcid, BSTR *help_string,
2255 DWORD *help_context, BSTR *help_dll)
2256{
2257 DWORD dummy_help_context, flags = 0;
2258 BSTR dummy_help_string, dummy_help_dll;
2259 HRESULT hr;
2260
2261 TRACE("%p, %d, %#lx, %p, %p, %p.\n", This, index, lcid, help_string, help_context, help_dll);
2262
2263 if(!help_string) help_string = &dummy_help_string;
2264 else flags = 1;
2265
2266 if(!help_context) help_context = &dummy_help_context;
2267 else flags |= 2;
2268
2269 if(!help_dll) help_dll = &dummy_help_dll;
2270 else flags |= 4;
2271
2272 hr = ITypeLib2_RemoteGetDocumentation2_Proxy(This, index, lcid, flags, help_string, help_context, help_dll);
2273
2274 /* We don't need to free the dummy BSTRs since the stub ensures that these will be NULLs. */
2275
2276 return hr;
2277}
2278
2280 DWORD flags, BSTR *help_string,
2281 DWORD *help_context, BSTR *help_dll)
2282{
2283 TRACE("%p, %d, %#lx, %#lx, %p, %p, %p.\n", This, index, lcid, flags, help_string, help_context, help_dll);
2284
2285 *help_string = *help_dll = NULL;
2286 *help_context = 0;
2287
2288 if(!(flags & 1)) help_string = NULL;
2289 if(!(flags & 2)) help_context = NULL;
2290 if(!(flags & 4)) help_dll = NULL;
2291
2292 return ITypeLib2_GetDocumentation2(This, index, lcid, help_string, help_context, help_dll);
2293}
2294
2297 LPCOLESTR pszPropName,
2298 VARIANT *pVar,
2299 IErrorLog *pErrorLog)
2300{
2301 IUnknown *pUnk = NULL;
2302 TRACE("(%p, %s, %p, %p)\n", This, debugstr_w(pszPropName), pVar, pErrorLog);
2303
2304 if(!pVar)
2305 return E_POINTER;
2306
2307 if(V_VT(pVar) & (VT_BYREF | VT_ARRAY | VT_VECTOR))
2308 {
2309 FIXME("Variant type %x is byref, array or vector. Not implemented.\n", V_VT(pVar));
2310 return E_NOTIMPL;
2311 }
2312
2313 switch(V_VT(pVar))
2314 {
2315 case VT_DISPATCH:
2316 pUnk = (IUnknown*)V_DISPATCH(pVar);
2317 break;
2318 case VT_UNKNOWN:
2319 pUnk = V_UNKNOWN(pVar);
2320 break;
2321 case VT_SAFEARRAY:
2322 FIXME("Safearray support not yet implemented.\n");
2323 return E_NOTIMPL;
2324 default:
2325 FIXME("Unknown V_VT %d - support not yet implemented.\n", V_VT(pVar));
2326 return E_NOTIMPL;
2327 }
2328
2329 return IPropertyBag_RemoteRead_Proxy(This, pszPropName, pVar, pErrorLog,
2330 V_VT(pVar), pUnk);
2331}
2332
2335 LPCOLESTR pszPropName,
2336 VARIANT *pVar,
2337 IErrorLog *pErrorLog,
2338 DWORD varType,
2339 IUnknown *pUnkObj)
2340{
2341 IDispatch *disp;
2342 HRESULT hr;
2343
2344 TRACE("%p, %s, %p, %p, %lx, %p.\n", This, debugstr_w(pszPropName), pVar,
2345 pErrorLog, varType, pUnkObj);
2346
2347 if(varType & (VT_BYREF | VT_ARRAY | VT_VECTOR))
2348 {
2349 FIXME("Variant type %x is byref, array or vector. Not implemented.\n", V_VT(pVar));
2350 return E_NOTIMPL;
2351 }
2352
2353 V_VT(pVar) = varType;
2354 switch(varType)
2355 {
2356 case VT_DISPATCH:
2357 hr = IUnknown_QueryInterface(pUnkObj, &IID_IDispatch, (LPVOID*)&disp);
2358 if(FAILED(hr))
2359 return hr;
2360 IUnknown_Release(pUnkObj);
2361 V_DISPATCH(pVar) = disp;
2362 break;
2363 case VT_UNKNOWN:
2364 V_UNKNOWN(pVar) = pUnkObj;
2365 break;
2366 case VT_BSTR:
2367 V_BSTR(pVar) = SysAllocString(L"");
2368 break;
2369 case VT_SAFEARRAY:
2370 FIXME("Safearray support not yet implemented.\n");
2371 return E_NOTIMPL;
2372 default:
2373 break;
2374 }
2375 hr = IPropertyBag_Read(This, pszPropName, pVar, pErrorLog);
2376 if(FAILED(hr))
2377 VariantClear(pVar);
2378
2379 return hr;
2380}
2381
2382/* call_as/local stubs for ocidl.idl */
2383
2386 IUnknown *pUnkOuter,
2388 REFIID riid,
2389 BSTR bstrKey,
2390 PVOID *ppvObj)
2391{
2392 TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppvObj);
2393
2394 *ppvObj = NULL;
2395
2396 if (pUnkOuter)
2397 {
2398 ERR("aggregation is not allowed on remote objects\n");
2399 return CLASS_E_NOAGGREGATION;
2400 }
2401
2402 return IClassFactory2_RemoteCreateInstanceLic_Proxy(This, riid, bstrKey, (IUnknown**)ppvObj);
2403}
2404
2407 REFIID riid,
2408 BSTR bstrKey,
2409 IUnknown **ppvObj)
2410{
2411 TRACE("(%s, %p)\n", debugstr_guid(riid), ppvObj);
2412 return IClassFactory2_CreateInstanceLic(This, NULL, NULL, riid, bstrKey, (void**)ppvObj);
2413}
2414
2417 ULONG cConnections,
2418 LPCONNECTDATA rgcd,
2419 ULONG *pcFetched)
2420{
2421 ULONG fetched;
2422
2423 TRACE("%lu, %p, %p.\n", cConnections, rgcd, pcFetched);
2424
2425 if (!pcFetched)
2426 pcFetched = &fetched;
2427
2428 return IEnumConnections_RemoteNext_Proxy(This, cConnections, rgcd, pcFetched);
2429}
2430
2433 ULONG cConnections,
2434 LPCONNECTDATA rgcd,
2435 ULONG *pcFetched)
2436{
2437 HRESULT hr;
2438
2439 TRACE("%lu, %p, %p.\n", cConnections, rgcd, pcFetched);
2440
2441 *pcFetched = 0;
2442 hr = IEnumConnections_Next(This, cConnections, rgcd, pcFetched);
2443 if (hr == S_OK)
2444 *pcFetched = cConnections;
2445
2446 return hr;
2447}
2448
2451 ULONG cConnections,
2452 IConnectionPoint **ppCP,
2453 ULONG *pcFetched)
2454{
2455 ULONG fetched;
2456
2457 TRACE("%lu, %p %p.\n", cConnections, ppCP, pcFetched);
2458
2459 if (!pcFetched)
2460 pcFetched = &fetched;
2461
2462 return IEnumConnectionPoints_RemoteNext_Proxy(This, cConnections, ppCP, pcFetched);
2463}
2464
2467 ULONG cConnections,
2468 IConnectionPoint **ppCP,
2469 ULONG *pcFetched)
2470{
2471 HRESULT hr;
2472
2473 TRACE("%lu, %p, %p.\n", cConnections, ppCP, pcFetched);
2474
2475 *pcFetched = 0;
2476 hr = IEnumConnectionPoints_Next(This, cConnections, ppCP, pcFetched);
2477 if (hr == S_OK)
2478 *pcFetched = cConnections;
2479
2480 return hr;
2481}
2482
2485 LPVOID pMem,
2486 ULONG cbSize)
2487{
2488 TRACE("%p, %lu.\n", pMem, cbSize);
2489
2490 if (!pMem)
2491 return E_POINTER;
2492
2493 return IPersistMemory_RemoteLoad_Proxy(This, pMem, cbSize);
2494}
2495
2498 BYTE *pMem,
2499 ULONG cbSize)
2500{
2501 TRACE("%p, %lu.\n", pMem, cbSize);
2502 return IPersistMemory_Load(This, pMem, cbSize);
2503}
2504
2507 LPVOID pMem,
2508 BOOL fClearDirty,
2509 ULONG cbSize)
2510{
2511 TRACE("%p, %d, %lu.\n", pMem, fClearDirty, cbSize);
2512
2513 if (!pMem)
2514 return E_POINTER;
2515
2516 return IPersistMemory_RemoteSave_Proxy(This, pMem, fClearDirty, cbSize);
2517}
2518
2521 BYTE *pMem,
2522 BOOL fClearDirty,
2523 ULONG cbSize)
2524{
2525 TRACE("%p, %d, %lu.\n", pMem, fClearDirty, cbSize);
2526 return IPersistMemory_Save(This, pMem, fClearDirty, cbSize);
2527}
2528
2531 DWORD dwViewStatus)
2532{
2533 TRACE("%p, %#lx.\n", This, dwViewStatus);
2534 IAdviseSinkEx_RemoteOnViewStatusChange_Proxy(This, dwViewStatus);
2535}
2536
2539 DWORD dwViewStatus)
2540{
2541 TRACE("%p, %#lx.\n", This, dwViewStatus);
2542 IAdviseSinkEx_OnViewStatusChange(This, dwViewStatus);
2543 return S_OK;
2544}
2545
2548 ULONG cElt,
2549 IOleUndoUnit **rgElt,
2550 ULONG *pcEltFetched)
2551{
2552 ULONG fetched;
2553
2554 TRACE("%lu, %p %p.\n", cElt, rgElt, pcEltFetched);
2555
2556 if (!pcEltFetched)
2557 pcEltFetched = &fetched;
2558
2559 return IEnumOleUndoUnits_RemoteNext_Proxy(This, cElt, rgElt, pcEltFetched);
2560}
2561
2564 ULONG cElt,
2565 IOleUndoUnit **rgElt,
2566 ULONG *pcEltFetched)
2567{
2568 HRESULT hr;
2569
2570 TRACE("%lu, %p, %p.\n", cElt, rgElt, pcEltFetched);
2571
2572 *pcEltFetched = 0;
2573 hr = IEnumOleUndoUnits_Next(This, cElt, rgElt, pcEltFetched);
2574 if (hr == S_OK)
2575 *pcEltFetched = cElt;
2576
2577 return hr;
2578}
2579
2582 QACONTAINER *pQaContainer,
2583 QACONTROL *pQaControl)
2584{
2585 FIXME("not implemented\n");
2586 return E_NOTIMPL;
2587}
2588
2591 QACONTAINER *pQaContainer,
2592 QACONTROL *pQaControl)
2593{
2594 FIXME("not implemented\n");
2595 return E_NOTIMPL;
2596}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
#define CHAR(Char)
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
Definition: bufpool.h:45
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
ush Pos
Definition: deflate.h:92
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#define ALIGN_LENGTH(_Len, _Align)
Definition: usrmarshal.c:31
#define ALIGN_POINTER(_Ptr, _Align)
Definition: usrmarshal.c:32
unsigned char *WINAPI WdtpInterfacePointer_UserMarshal(ULONG *pFlags, ULONG RealFlags, unsigned char *pBuffer, IUnknown *punk, REFIID riid)
Definition: usrmarshal.c:917
unsigned char *WINAPI WdtpInterfacePointer_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, IUnknown **ppunk, REFIID riid)
Definition: usrmarshal.c:974
ULONG __RPC_USER WdtpInterfacePointer_UserSize(ULONG *pFlags, ULONG RealFlags, ULONG StartingSize, IUnknown *punk, REFIID riid)
Definition: usrmarshal.c:882
double DATE
Definition: compat.h:2253
union tagCY CY
struct tagDEC DECIMAL
struct tagVARIANT VARIANT
Definition: compat.h:2377
WCHAR OLECHAR
Definition: compat.h:2292
OLECHAR * BSTR
Definition: compat.h:2293
unsigned short VARTYPE
Definition: compat.h:2254
#define CALLBACK
Definition: compat.h:35
short VARIANT_BOOL
Definition: compat.h:2290
LONG SCODE
Definition: compat.h:2252
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_UINT_PTR
Definition: compat.h:2328
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_TYPEMASK
Definition: compat.h:2346
@ VT_BYREF
Definition: compat.h:2342
@ 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_ARRAY
Definition: compat.h:2341
@ VT_SAFEARRAY
Definition: compat.h:2321
@ 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_HRESULT
Definition: compat.h:2319
@ VT_INT_PTR
Definition: compat.h:2327
@ 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_EMPTY
Definition: compat.h:2295
@ VT_CARRAY
Definition: compat.h:2322
@ VT_RECORD
Definition: compat.h:2326
@ VT_VECTOR
Definition: compat.h:2340
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
LCID lcid
Definition: locale.c:5660
GUID guid
Definition: version.c:147
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
HRESULT WINAPI SafeArrayGetIID(SAFEARRAY *psa, GUID *pGuid)
Definition: safearray.c:1670
HRESULT WINAPI SafeArrayDestroyData(SAFEARRAY *psa)
Definition: safearray.c:1256
HRESULT WINAPI SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY **ppsaOut)
Definition: safearray.c:476
HRESULT WINAPI SafeArrayGetRecordInfo(SAFEARRAY *psa, IRecordInfo **pRinfo)
Definition: safearray.c:1609
SAFEARRAY *WINAPI SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound, LPVOID pvExtra)
Definition: safearray.c:628
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
HRESULT WINAPI SafeArrayAllocData(SAFEARRAY *psa)
Definition: safearray.c:557
HRESULT WINAPI SafeArrayGetVartype(SAFEARRAY *psa, VARTYPE *pvt)
Definition: safearray.c:1534
unsigned char *WINAPI CLEANLOCALSTORAGE_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstr)
Definition: usrmarshal.c:113
HRESULT __RPC_STUB ITypeInfo_Invoke_Stub(ITypeInfo *This)
Definition: usrmarshal.c:1793
static ULONG SAFEARRAY_GetCellCount(const SAFEARRAY *psa)
Definition: usrmarshal.c:675
HRESULT __RPC_STUB ITypeInfo_GetTypeAttr_Stub(ITypeInfo *This, LPTYPEATTR *ppTypeAttr, CLEANLOCALSTORAGE *pDummy)
Definition: usrmarshal.c:1649
HRESULT CALLBACK ITypeInfo_GetDocumentation_Proxy(ITypeInfo *This, MEMBERID memid, BSTR *name, BSTR *doc_string, DWORD *help_context, BSTR *help_file)
Definition: usrmarshal.c:1800
HRESULT __RPC_STUB ITypeInfo_GetDllEntry_Stub(ITypeInfo *This, MEMBERID memid, INVOKEKIND invkind, DWORD flags, BSTR *dll_name, BSTR *name, WORD *ordinal)
Definition: usrmarshal.c:1873
HRESULT __RPC_STUB ITypeLib_FindName_Stub(ITypeLib *This, LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo **ppTInfo, MEMBERID *rgMemId, USHORT *pcFound, BSTR *pBstrLibName)
Definition: usrmarshal.c:2204
HRESULT __RPC_STUB IEnumConnectionPoints_Next_Stub(IEnumConnectionPoints *This, ULONG cConnections, IConnectionPoint **ppCP, ULONG *pcFetched)
Definition: usrmarshal.c:2465
HRESULT CALLBACK ITypeLib_IsName_Proxy(ITypeLib *This, LPOLESTR szNameBuf, ULONG lHashVal, BOOL *pfName)
Definition: usrmarshal.c:2171
HRESULT __RPC_STUB ITypeInfo_GetNames_Stub(ITypeInfo *This, MEMBERID memid, BSTR *rgBstrNames, UINT cMaxNames, UINT *pcNames)
Definition: usrmarshal.c:1750
HRESULT CALLBACK ITypeLib_GetLibAttr_Proxy(ITypeLib *This, TLIBATTR **ppTLibAttr)
Definition: usrmarshal.c:2093
HRESULT CALLBACK IPersistMemory_Save_Proxy(IPersistMemory *This, LPVOID pMem, BOOL fClearDirty, ULONG cbSize)
Definition: usrmarshal.c:2505
void WINAPI VARIANT_UserFree(ULONG *pFlags, VARIANT *pvar)
Definition: usrmarshal.c:628
HRESULT CALLBACK ITypeInfo2_GetDocumentation2_Proxy(ITypeInfo2 *This, MEMBERID memid, LCID lcid, BSTR *help_string, DWORD *help_context, BSTR *help_dll)
Definition: usrmarshal.c:2028
HRESULT __RPC_STUB ITypeLib_GetDocumentation_Stub(ITypeLib *This, INT index, DWORD flags, BSTR *name, BSTR *doc_string, DWORD *help_context, BSTR *help_file)
Definition: usrmarshal.c:2154
HRESULT __RPC_STUB IPersistMemory_Save_Stub(IPersistMemory *This, BYTE *pMem, BOOL fClearDirty, ULONG cbSize)
Definition: usrmarshal.c:2519
#define CLS_VARDESC
Definition: usrmarshal.c:71
static unsigned interface_user_size(ULONG *pFlags, ULONG Start, REFIID riid, IUnknown *punk)
Definition: usrmarshal.c:269
static void free_embedded_arraydesc(ARRAYDESC *adesc)
Definition: usrmarshal.c:1448
HRESULT __RPC_STUB ITypeLib2_GetLibStatistics_Stub(ITypeLib2 *This, ULONG *pcUniqueNames, ULONG *pcchUniqueNames)
Definition: usrmarshal.c:2244
static SF_TYPE SAFEARRAY_GetUnionType(SAFEARRAY *psa)
Definition: usrmarshal.c:692
unsigned char *WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buffer, LPSAFEARRAY *ppsa)
Definition: usrmarshal.c:887
void WINAPI BSTR_UserFree(ULONG *pFlags, BSTR *pstr)
Definition: usrmarshal.c:187
unsigned char *WINAPI VARIANT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, VARIANT *pvar)
Definition: usrmarshal.c:490
static unsigned char * interface_user_marshal(ULONG *pFlags, unsigned char *Buffer, REFIID riid, IUnknown *punk)
Definition: usrmarshal.c:325
unsigned char *WINAPI HFONT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont)
Definition: usrmarshal.c:1222
HRESULT CALLBACK IQuickActivate_QuickActivate_Proxy(IQuickActivate *This, QACONTAINER *pQaContainer, QACONTROL *pQaControl)
Definition: usrmarshal.c:2580
HRESULT __RPC_STUB ITypeComp_Bind_Stub(ITypeComp *This, LPOLESTR name, ULONG lHashVal, WORD flags, ITypeInfo **ti, DESCKIND *desckind, FUNCDESC **funcdesc, VARDESC **vardesc, ITypeComp **typecomp, CLEANLOCALSTORAGE *stg)
Definition: usrmarshal.c:1535
HRESULT __RPC_STUB ITypeInfo_GetIDsOfNames_Stub(ITypeInfo *This)
Definition: usrmarshal.c:1772
HRESULT CALLBACK ITypeComp_BindType_Proxy(ITypeComp *This, LPOLESTR name, ULONG lHashVal, ITypeInfo **ti, ITypeComp **typecomp)
Definition: usrmarshal.c:1593
HRESULT __RPC_STUB IDispatch_Invoke_Stub(IDispatch *This, DISPID dispIdMember, REFIID riid, LCID lcid, DWORD dwFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *pArgErr, UINT cVarRef, UINT *rgVarRefIdx, VARIANTARG *rgVarRef)
Definition: usrmarshal.c:1335
#define CLS_FUNCDESC
Definition: usrmarshal.c:68
HRESULT __RPC_STUB ITypeInfo2_GetDocumentation2_Stub(ITypeInfo2 *This, MEMBERID memid, LCID lcid, DWORD flags, BSTR *help_string, DWORD *help_context, BSTR *help_dll)
Definition: usrmarshal.c:2054
void CALLBACK ITypeInfo_ReleaseVarDesc_Proxy(ITypeInfo *This, VARDESC *pVarDesc)
Definition: usrmarshal.c:2003
HRESULT __RPC_STUB IEnumOleUndoUnits_Next_Stub(IEnumOleUndoUnits *This, ULONG cElt, IOleUndoUnit **rgElt, ULONG *pcEltFetched)
Definition: usrmarshal.c:2562
HRESULT __RPC_STUB ITypeInfo_ReleaseFuncDesc_Stub(ITypeInfo *This)
Definition: usrmarshal.c:1996
void CALLBACK ITypeInfo_ReleaseFuncDesc_Proxy(ITypeInfo *This, FUNCDESC *pFuncDesc)
Definition: usrmarshal.c:1976
ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY *ppsa)
Definition: usrmarshal.c:785
void CALLBACK ITypeLib_ReleaseTLibAttr_Proxy(ITypeLib *This, TLIBATTR *pTLibAttr)
Definition: usrmarshal.c:2217
HRESULT CALLBACK ITypeLib_GetDocumentation_Proxy(ITypeLib *This, INT index, BSTR *name, BSTR *doc_string, DWORD *help_context, BSTR *help_file)
Definition: usrmarshal.c:2126
#define CLS_LIBATTR
Definition: usrmarshal.c:69
HRESULT CALLBACK ITypeInfo_AddressOfMember_Proxy(ITypeInfo *This, MEMBERID memid, INVOKEKIND invKind, PVOID *ppv)
Definition: usrmarshal.c:1890
HRESULT __RPC_STUB ITypeComp_BindType_Stub(ITypeComp *This, LPOLESTR name, ULONG lHashVal, ITypeInfo **ti)
Definition: usrmarshal.c:1613
HRESULT __RPC_STUB ITypeInfo_CreateInstance_Stub(ITypeInfo *This, REFIID riid, IUnknown **ppvObj)
Definition: usrmarshal.c:1917
#define FADF_AUTOSETFLAGS
Definition: usrmarshal.c:1025
static ULONG wire_extra_user_size(ULONG *pFlags, ULONG Start, VARIANT *pvar)
Definition: usrmarshal.c:287
HRESULT CALLBACK IPersistMemory_Load_Proxy(IPersistMemory *This, LPVOID pMem, ULONG cbSize)
Definition: usrmarshal.c:2483
void CALLBACK ITypeInfo_ReleaseTypeAttr_Proxy(ITypeInfo *This, TYPEATTR *pTypeAttr)
Definition: usrmarshal.c:1960
HRESULT __RPC_STUB ITypeInfo_GetDocumentation_Stub(ITypeInfo *This, MEMBERID memid, DWORD flags, BSTR *name, BSTR *doc_string, DWORD *help_context, BSTR *help_file)
Definition: usrmarshal.c:1829
HRESULT CALLBACK IEnumOleUndoUnits_Next_Proxy(IEnumOleUndoUnits *This, ULONG cElt, IOleUndoUnit **rgElt, ULONG *pcEltFetched)
Definition: usrmarshal.c:2546
ULONG WINAPI BSTR_UserSize(ULONG *pFlags, ULONG Start, BSTR *pstr)
Definition: usrmarshal.c:134
unsigned char *WINAPI HFONT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont)
Definition: usrmarshal.c:1228
HRESULT CALLBACK ITypeLib2_GetDocumentation2_Proxy(ITypeLib2 *This, INT index, LCID lcid, BSTR *help_string, DWORD *help_context, BSTR *help_dll)
Definition: usrmarshal.c:2253
HRESULT CALLBACK IDispatch_Invoke_Proxy(IDispatch *This, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: usrmarshal.c:1245
void CALLBACK IAdviseSinkEx_OnViewStatusChange_Proxy(IAdviseSinkEx *This, DWORD dwViewStatus)
Definition: usrmarshal.c:2529
UINT CALLBACK ITypeLib_GetTypeInfoCount_Proxy(ITypeLib *This)
Definition: usrmarshal.c:2073
static unsigned char * interface_user_unmarshal(ULONG *pFlags, unsigned char *Buffer, REFIID riid, IUnknown **ppunk)
Definition: usrmarshal.c:346
unsigned char *WINAPI VARIANT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, VARIANT *pvar)
Definition: usrmarshal.c:386
HRESULT CALLBACK ITypeInfo_GetVarDesc_Proxy(ITypeInfo *This, UINT index, VARDESC **ppVarDesc)
Definition: usrmarshal.c:1703
ULONG WINAPI VARIANT_UserSize(ULONG *pFlags, ULONG Start, VARIANT *pvar)
Definition: usrmarshal.c:363
HRESULT __RPC_STUB IPropertyBag_Read_Stub(IPropertyBag *This, LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog, DWORD varType, IUnknown *pUnkObj)
Definition: usrmarshal.c:2333
HRESULT __RPC_STUB ITypeLib_GetLibAttr_Stub(ITypeLib *This, LPTLIBATTR *ppTLibAttr, CLEANLOCALSTORAGE *pDummy)
Definition: usrmarshal.c:2107
HRESULT CALLBACK ITypeInfo_GetNames_Proxy(ITypeInfo *This, MEMBERID memid, BSTR *rgBstrNames, UINT cMaxNames, UINT *pcNames)
Definition: usrmarshal.c:1738
HRESULT CALLBACK IEnumConnections_Next_Proxy(IEnumConnections *This, ULONG cConnections, LPCONNECTDATA rgcd, ULONG *pcFetched)
Definition: usrmarshal.c:2415
HRESULT CALLBACK ITypeInfo_GetDllEntry_Proxy(ITypeInfo *This, MEMBERID memid, INVOKEKIND invkind, BSTR *dll_name, BSTR *name, WORD *ordinal)
Definition: usrmarshal.c:1846
HRESULT CALLBACK ITypeInfo_GetContainingTypeLib_Proxy(ITypeInfo *This, ITypeLib **ppTLib, UINT *pIndex)
Definition: usrmarshal.c:1926
HRESULT CALLBACK ITypeLib_FindName_Proxy(ITypeLib *This, LPOLESTR szNameBuf, ULONG lHashVal, ITypeInfo **ppTInfo, MEMBERID *rgMemId, USHORT *pcFound)
Definition: usrmarshal.c:2192
unsigned char *WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, LPSAFEARRAY *ppsa)
Definition: usrmarshal.c:1029
HRESULT CALLBACK ITypeComp_Bind_Proxy(ITypeComp *This, LPOLESTR name, ULONG lHashVal, WORD flags, ITypeInfo **ti, DESCKIND *desckind, BINDPTR *bindptr)
Definition: usrmarshal.c:1489
static void dump_user_flags(const ULONG *pFlags)
Definition: usrmarshal.c:50
static DWORD elem_mem_size(wireSAFEARRAY wiresa, SF_TYPE sftype)
Definition: usrmarshal.c:765
HRESULT __RPC_STUB ITypeInfo_AddressOfMember_Stub(ITypeInfo *This)
Definition: usrmarshal.c:1900
HRESULT __RPC_STUB ITypeInfo_GetFuncDesc_Stub(ITypeInfo *This, UINT index, LPFUNCDESC *ppFuncDesc, CLEANLOCALSTORAGE *pDummy)
Definition: usrmarshal.c:1683
HRESULT __RPC_STUB IQuickActivate_QuickActivate_Stub(IQuickActivate *This, QACONTAINER *pQaContainer, QACONTROL *pQaControl)
Definition: usrmarshal.c:2589
HRESULT CALLBACK IEnumVARIANT_Next_Proxy(IEnumVARIANT *This, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
Definition: usrmarshal.c:1414
HRESULT CALLBACK ITypeInfo_GetFuncDesc_Proxy(ITypeInfo *This, UINT index, FUNCDESC **ppFuncDesc)
Definition: usrmarshal.c:1668
HRESULT __RPC_STUB ITypeInfo_GetContainingTypeLib_Stub(ITypeInfo *This, ITypeLib **ppTLib, UINT *pIndex)
Definition: usrmarshal.c:1951
HRESULT CALLBACK ITypeInfo_GetIDsOfNames_Proxy(ITypeInfo *This, LPOLESTR *rgszNames, UINT cNames, MEMBERID *pMemId)
Definition: usrmarshal.c:1762
ULONG WINAPI CLEANLOCALSTORAGE_UserSize(ULONG *pFlags, ULONG Start, CLEANLOCALSTORAGE *pstg)
Definition: usrmarshal.c:73
static unsigned int get_type_alignment(ULONG *pFlags, VARTYPE vt)
Definition: usrmarshal.c:259
HRESULT __RPC_STUB ITypeInfo_GetVarDesc_Stub(ITypeInfo *This, UINT index, LPVARDESC *ppVarDesc, CLEANLOCALSTORAGE *pDummy)
Definition: usrmarshal.c:1718
static void free_embedded_typedesc(TYPEDESC *tdesc)
Definition: usrmarshal.c:1464
HRESULT __RPC_STUB ITypeLib_IsName_Stub(ITypeLib *This, LPOLESTR szNameBuf, ULONG lHashVal, BOOL *pfName, BSTR *pBstrLibName)
Definition: usrmarshal.c:2181
static DWORD elem_wire_size(LPSAFEARRAY lpsa, SF_TYPE sftype)
Definition: usrmarshal.c:747
HRESULT CALLBACK ITypeInfo_GetTypeAttr_Proxy(ITypeInfo *This, TYPEATTR **ppTypeAttr)
Definition: usrmarshal.c:1634
void WINAPI CLEANLOCALSTORAGE_UserFree(ULONG *pFlags, CLEANLOCALSTORAGE *pstr)
Definition: usrmarshal.c:120
void WINAPI LPSAFEARRAY_UserFree(ULONG *pFlags, LPSAFEARRAY *ppsa)
Definition: usrmarshal.c:1207
HRESULT CALLBACK ITypeLib2_GetLibStatistics_Proxy(ITypeLib2 *This, ULONG *pcUniqueNames, ULONG *pcchUniqueNames)
Definition: usrmarshal.c:2235
HRESULT __RPC_STUB IEnumVARIANT_Next_Stub(IEnumVARIANT *This, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
Definition: usrmarshal.c:1429
HRESULT __RPC_STUB ITypeLib_GetTypeInfoCount_Stub(ITypeLib *This, UINT *pcTInfo)
Definition: usrmarshal.c:2084
unsigned char *WINAPI CLEANLOCALSTORAGE_UserMarshal(ULONG *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstg)
Definition: usrmarshal.c:79
HRESULT __RPC_STUB ITypeLib2_GetDocumentation2_Stub(ITypeLib2 *This, INT index, LCID lcid, DWORD flags, BSTR *help_string, DWORD *help_context, BSTR *help_dll)
Definition: usrmarshal.c:2279
HRESULT __RPC_STUB IEnumConnections_Next_Stub(IEnumConnections *This, ULONG cConnections, LPCONNECTDATA rgcd, ULONG *pcFetched)
Definition: usrmarshal.c:2431
HRESULT CALLBACK IPropertyBag_Read_Proxy(IPropertyBag *This, LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog)
Definition: usrmarshal.c:2295
HRESULT __RPC_STUB ITypeLib_ReleaseTLibAttr_Stub(ITypeLib *This)
Definition: usrmarshal.c:2225
HRESULT CALLBACK IEnumConnectionPoints_Next_Proxy(IEnumConnectionPoints *This, ULONG cConnections, IConnectionPoint **ppCP, ULONG *pcFetched)
Definition: usrmarshal.c:2449
HRESULT __RPC_STUB IPersistMemory_Load_Stub(IPersistMemory *This, BYTE *pMem, ULONG cbSize)
Definition: usrmarshal.c:2496
HRESULT __RPC_STUB IAdviseSinkEx_OnViewStatusChange_Stub(IAdviseSinkEx *This, DWORD dwViewStatus)
Definition: usrmarshal.c:2537
ULONG WINAPI HFONT_UserSize(ULONG *pFlags, ULONG Start, HFONT *phfont)
Definition: usrmarshal.c:1216
unsigned char *WINAPI BSTR_UserMarshal(ULONG *pFlags, unsigned char *Buffer, BSTR *pstr)
Definition: usrmarshal.c:144
HRESULT __RPC_STUB ITypeInfo_ReleaseVarDesc_Stub(ITypeInfo *This)
Definition: usrmarshal.c:2018
HRESULT CALLBACK ITypeInfo_Invoke_Proxy(ITypeInfo *This, PVOID pvInstance, MEMBERID memid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: usrmarshal.c:1779
HRESULT __RPC_STUB ITypeInfo_ReleaseTypeAttr_Stub(ITypeInfo *This)
Definition: usrmarshal.c:1969
unsigned char *WINAPI BSTR_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, BSTR *pstr)
Definition: usrmarshal.c:166
HRESULT CALLBACK IClassFactory2_CreateInstanceLic_Proxy(IClassFactory2 *This, IUnknown *pUnkOuter, IUnknown *pUnkReserved, REFIID riid, BSTR bstrKey, PVOID *ppvObj)
Definition: usrmarshal.c:2384
static void free_embedded_elemdesc(ELEMDESC *edesc)
Definition: usrmarshal.c:1480
HRESULT __RPC_STUB IClassFactory2_CreateInstanceLic_Stub(IClassFactory2 *This, REFIID riid, BSTR bstrKey, IUnknown **ppvObj)
Definition: usrmarshal.c:2405
#define CLS_TYPEATTR
Definition: usrmarshal.c:70
void WINAPI HFONT_UserFree(ULONG *pFlags, HFONT *phfont)
Definition: usrmarshal.c:1234
HRESULT CALLBACK ITypeInfo_CreateInstance_Proxy(ITypeInfo *This, IUnknown *pUnkOuter, REFIID riid, PVOID *ppvObj)
Definition: usrmarshal.c:1907
unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
Definition: usrmarshal.c:207
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
#define L(x)
Definition: resources.c:13
int align(int length, int align)
Definition: dsound8.c:36
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
return pTarget Start()
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
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
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 * u
Definition: glfuncs.h:240
unsigned int UINT
Definition: sysinfo.c:13
#define FLOAT
Definition: i386-dis.c:525
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static IUnknown * pUnkReserved
Definition: asmenum.c:33
#define DOUBLE(x)
Definition: atom.c:30
static VARIANTARG static DISPID
Definition: ordinal.c:49
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
Definition: usp10.c:64
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
struct _IID IID
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4565
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define DWORD
Definition: nt_native.h:44
UINT WINAPI SysStringByteLen(BSTR str)
Definition: oleaut.c:217
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
int WINAPI SysReAllocStringLen(BSTR *old, const OLECHAR *str, unsigned int len)
Definition: oleaut.c:385
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_ARRAYREF(A)
Definition: oleauto.h:223
#define V_BSTRREF(A)
Definition: oleauto.h:227
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_UNKNOWNREF(A)
Definition: oleauto.h:282
#define V_ISBYREF(A)
Definition: oleauto.h:217
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_DISPATCHREF(A)
Definition: oleauto.h:240
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_BYREF(A)
Definition: oleauto.h:228
#define V_ISARRAY(A)
Definition: oleauto.h:218
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_RECORD(A)
Definition: oleauto.h:213
#define V_UI8(A)
Definition: oleauto.h:272
const GUID IID_IDispatch
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define INT
Definition: polytest.cpp:20
#define REFIID
Definition: guiddef.h:118
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:68
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:213
DWORD LCID
Definition: nls.h:13
#define __RPC_STUB
Definition: rpc.h:62
#define __RPC_USER
Definition: rpc.h:61
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
DWORD byte_len
Definition: usrmarshal.c:130
DWORD len2
Definition: usrmarshal.c:131
Definition: name.c:39
Definition: send.c:48
USHORT cDims
Definition: compat.h:2355
ULONG cbElements
Definition: compat.h:2357
WORD wReserved1
Definition: compat.h:2382
WORD wReserved2
Definition: compat.h:2383
WORD wReserved3
Definition: compat.h:2384
USHORT wReserved3
Definition: usrmarshal.c:203
DWORD rpcReserved
Definition: usrmarshal.c:199
USHORT wReserved1
Definition: usrmarshal.c:201
USHORT wReserved2
Definition: usrmarshal.c:202
#define max(a, b)
Definition: svc.c:63
uint32_t DWORD_PTR
Definition: typedefs.h:65
int64_t LONGLONG
Definition: typedefs.h:68
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc)
Definition: variant.c:724
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
#define DISP_E_BADCALLEE
Definition: winerror.h:3628
#define RPC_S_INVALID_BOUND
Definition: winerror.h:1400
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define E_POINTER
Definition: winerror.h:3480
unsigned char BYTE
Definition: xxhash.c:193