2 * Misc marshalling routines
4 * Copyright 2002 Ove Kaaven
5 * Copyright 2003 Mike Hearn
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.
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.
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
25 #define NONAMELESSUNION
26 #define NONAMELESSSTRUCT
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
40 /* FIXME: not supposed to be here */
42 const CLSID CLSID_PSDispatch
= {
43 0x20420, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}
46 static CStdPSFactoryBuffer PSFactoryBuffer
;
48 CSTDSTUBBUFFERRELEASE(&PSFactoryBuffer
)
50 extern const ExtendedProxyFileInfo oaidl_ProxyFileInfo
;
52 const ProxyFileInfo
* OLEAUT32_ProxyFileList
[] = {
57 HRESULT
OLEAUTPS_DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
59 return NdrDllGetClassObject(rclsid
, riid
, ppv
, OLEAUT32_ProxyFileList
,
60 &CLSID_PSDispatch
, &PSFactoryBuffer
);
63 /* CLEANLOCALSTORAGE */
64 /* I'm not sure how this is supposed to work yet */
66 unsigned long WINAPI
CLEANLOCALSTORAGE_UserSize(unsigned long *pFlags
, unsigned long Start
, CLEANLOCALSTORAGE
*pstg
)
68 return Start
+ sizeof(DWORD
);
71 unsigned char * WINAPI
CLEANLOCALSTORAGE_UserMarshal(unsigned long *pFlags
, unsigned char *Buffer
, CLEANLOCALSTORAGE
*pstg
)
74 return Buffer
+ sizeof(DWORD
);
77 unsigned char * WINAPI
CLEANLOCALSTORAGE_UserUnmarshal(unsigned long *pFlags
, unsigned char *Buffer
, CLEANLOCALSTORAGE
*pstr
)
79 return Buffer
+ sizeof(DWORD
);
82 void WINAPI
CLEANLOCALSTORAGE_UserFree(unsigned long *pFlags
, CLEANLOCALSTORAGE
*pstr
)
88 unsigned long WINAPI
BSTR_UserSize(unsigned long *pFlags
, unsigned long Start
, BSTR
*pstr
)
90 TRACE("(%lx,%ld,%p) => %p\n", *pFlags
, Start
, pstr
, *pstr
);
91 if (*pstr
) TRACE("string=%s\n", debugstr_w(*pstr
));
92 Start
+= sizeof(FLAGGED_WORD_BLOB
) + sizeof(OLECHAR
) * (SysStringLen(*pstr
) - 1);
93 TRACE("returning %ld\n", Start
);
97 unsigned char * WINAPI
BSTR_UserMarshal(unsigned long *pFlags
, unsigned char *Buffer
, BSTR
*pstr
)
99 wireBSTR str
= (wireBSTR
)Buffer
;
101 TRACE("(%lx,%p,%p) => %p\n", *pFlags
, Buffer
, pstr
, *pstr
);
102 if (*pstr
) TRACE("string=%s\n", debugstr_w(*pstr
));
104 str
->clSize
= SysStringLen(*pstr
);
106 memcpy(&str
->asData
, *pstr
, sizeof(OLECHAR
) * str
->clSize
);
107 return Buffer
+ sizeof(FLAGGED_WORD_BLOB
) + sizeof(OLECHAR
) * (str
->clSize
- 1);
110 unsigned char * WINAPI
BSTR_UserUnmarshal(unsigned long *pFlags
, unsigned char *Buffer
, BSTR
*pstr
)
112 wireBSTR str
= (wireBSTR
)Buffer
;
113 TRACE("(%lx,%p,%p) => %p\n", *pFlags
, Buffer
, pstr
, *pstr
);
115 SysReAllocStringLen(pstr
, (OLECHAR
*)&str
->asData
, str
->clSize
);
118 SysFreeString(*pstr
);
121 if (*pstr
) TRACE("string=%s\n", debugstr_w(*pstr
));
122 return Buffer
+ sizeof(FLAGGED_WORD_BLOB
) + sizeof(OLECHAR
) * (str
->clSize
- 1);
125 void WINAPI
BSTR_UserFree(unsigned long *pFlags
, BSTR
*pstr
)
127 TRACE("(%lx,%p) => %p\n", *pFlags
, pstr
, *pstr
);
129 SysFreeString(*pstr
);
135 /* I'm not too sure how to do this yet */
137 #define VARIANT_wiresize sizeof(struct _wireVARIANT)
139 static unsigned wire_size(VARTYPE vt
)
141 if (vt
& VT_ARRAY
) return 0;
143 switch (vt
& ~VT_BYREF
) {
152 return sizeof(SHORT
);
160 return sizeof(FLOAT
);
162 return sizeof(DOUBLE
);
164 return sizeof(VARIANT_BOOL
);
166 return sizeof(SCODE
);
172 return sizeof(DECIMAL
);
181 FIXME("unhandled VT %d\n", vt
);
186 static unsigned wire_extra(unsigned long *pFlags
, VARIANT
*pvar
)
191 if (V_VT(pvar
) & VT_ARRAY
) {
192 FIXME("wire-size safearray\n");
195 switch (V_VT(pvar
)) {
197 return BSTR_UserSize(pFlags
, 0, &V_BSTR(pvar
));
198 case VT_BSTR
| VT_BYREF
:
199 return BSTR_UserSize(pFlags
, 0, V_BSTRREF(pvar
));
201 case VT_SAFEARRAY
| VT_BYREF
:
202 FIXME("wire-size safearray\n");
204 case VT_VARIANT
| VT_BYREF
:
205 return VARIANT_UserSize(pFlags
, 0, V_VARIANTREF(pvar
));
208 /* find the buffer size of the marshalled dispatch interface */
209 hr
= CoGetMarshalSizeMax(&size
, &IID_IDispatch
, (IUnknown
*)V_DISPATCH(pvar
), LOWORD(*pFlags
), NULL
, MSHLFLAGS_NORMAL
);
211 ERR("Dispatch variant buffer size calculation failed, HRESULT=0x%lx\n", hr
);
214 size
+= sizeof(ULONG
); /* we have to store the buffersize in the stream */
215 TRACE("wire-size extra of dispatch variant is %ld\n", size
);
218 FIXME("wire-size record\n");
225 /* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the buffer. returns Buffer on failure, new position otherwise */
226 static unsigned char* dispatch_variant_marshal(unsigned long *pFlags
, unsigned char *Buffer
, VARIANT
*pvar
) {
229 void *working_memlocked
;
230 unsigned char *oldpos
;
234 TRACE("pFlags=%ld, Buffer=%p, pvar=%p\n", *pFlags
, Buffer
, pvar
);
238 /* CoMarshalInterface needs a stream, whereas at this level we are operating in terms of buffers.
239 * We create a stream on an HGLOBAL, so we can simply do a memcpy to move it to the buffer.
240 * in rpcrt4/ndr_ole.c, a simple IStream implementation is wrapped around the buffer object,
241 * but that would be overkill here, hence this implementation. We save the size because the unmarshal
242 * code has no way to know how long the marshalled buffer is. */
244 size
= wire_extra(pFlags
, pvar
);
246 working_mem
= GlobalAlloc(0, size
);
247 if (!working_mem
) return oldpos
;
249 hr
= CreateStreamOnHGlobal(working_mem
, TRUE
, &working
);
251 GlobalFree(working_mem
);
255 hr
= CoMarshalInterface(working
, &IID_IDispatch
, (IUnknown
*)V_DISPATCH(pvar
), LOWORD(*pFlags
), NULL
, MSHLFLAGS_NORMAL
);
257 IStream_Release(working
); /* this also releases the hglobal */
261 working_memlocked
= GlobalLock(working_mem
);
262 memcpy(Buffer
, &size
, sizeof(ULONG
)); /* copy the buffersize */
263 Buffer
+= sizeof(ULONG
);
264 memcpy(Buffer
, working_memlocked
, size
);
265 GlobalUnlock(working_mem
);
267 IStream_Release(working
);
269 TRACE("done, size=%ld\n", sizeof(ULONG
) + size
);
270 return Buffer
+ sizeof(ULONG
) + size
;
273 /* helper: called for VT_DISPATCH variants to unmarshal the buffer back into a dispatch variant. returns Buffer on failure, new position otherwise */
274 static unsigned char *dispatch_variant_unmarshal(unsigned long *pFlags
, unsigned char *Buffer
, VARIANT
*pvar
) {
277 void *working_memlocked
;
278 unsigned char *oldpos
;
282 TRACE("pFlags=%ld, Buffer=%p, pvar=%p\n", *pFlags
, Buffer
, pvar
);
286 /* get the buffersize */
287 memcpy(&size
, Buffer
, sizeof(ULONG
));
288 TRACE("buffersize=%ld\n", size
);
289 Buffer
+= sizeof(ULONG
);
291 working_mem
= GlobalAlloc(0, size
);
292 if (!working_mem
) return oldpos
;
294 hr
= CreateStreamOnHGlobal(working_mem
, TRUE
, &working
);
296 GlobalFree(working_mem
);
300 working_memlocked
= GlobalLock(working_mem
);
302 /* now we copy the contents of the marshalling buffer to working_memlocked, unlock it, and demarshal the stream */
303 memcpy(working_memlocked
, Buffer
, size
);
304 GlobalUnlock(working_mem
);
306 hr
= CoUnmarshalInterface(working
, &IID_IDispatch
, (void**)&V_DISPATCH(pvar
));
308 IStream_Release(working
);
312 IStream_Release(working
); /* this also frees the underlying hglobal */
314 TRACE("done, processed=%ld bytes\n", sizeof(ULONG
) + size
);
315 return Buffer
+ sizeof(ULONG
) + size
;
319 unsigned long WINAPI
VARIANT_UserSize(unsigned long *pFlags
, unsigned long Start
, VARIANT
*pvar
)
321 TRACE("(%lx,%ld,%p)\n", *pFlags
, Start
, pvar
);
322 TRACE("vt=%04x\n", V_VT(pvar
));
323 Start
+= VARIANT_wiresize
+ wire_extra(pFlags
, pvar
);
324 TRACE("returning %ld\n", Start
);
328 unsigned char * WINAPI
VARIANT_UserMarshal(unsigned long *pFlags
, unsigned char *Buffer
, VARIANT
*pvar
)
330 wireVARIANT var
= (wireVARIANT
)Buffer
;
331 unsigned size
, extra
;
332 unsigned char *Pos
= Buffer
+ VARIANT_wiresize
;
334 TRACE("(%lx,%p,%p)\n", *pFlags
, Buffer
, pvar
);
335 TRACE("vt=%04x\n", V_VT(pvar
));
337 memset(var
, 0, sizeof(*var
));
338 var
->clSize
= sizeof(*var
);
339 var
->vt
= pvar
->n1
.n2
.vt
;
341 var
->rpcReserved
= var
->vt
;
342 if ((var
->vt
& VT_ARRAY
) ||
343 ((var
->vt
& VT_TYPEMASK
) == VT_SAFEARRAY
))
344 var
->vt
= VT_ARRAY
| (var
->vt
& VT_BYREF
);
346 if (var
->vt
== VT_DECIMAL
) {
347 /* special case because decVal is on a different level */
348 var
->u
.decVal
= pvar
->n1
.decVal
;
352 size
= wire_size(V_VT(pvar
));
353 extra
= wire_extra(pFlags
, pvar
);
354 var
->wReserved1
= pvar
->n1
.n2
.wReserved1
;
355 var
->wReserved2
= pvar
->n1
.n2
.wReserved2
;
356 var
->wReserved3
= pvar
->n1
.n2
.wReserved3
;
358 if (var
->vt
& VT_BYREF
)
359 memcpy(&var
->u
.cVal
, pvar
->n1
.n2
.n3
.byref
, size
);
361 memcpy(&var
->u
.cVal
, &pvar
->n1
.n2
.n3
, size
);
363 if (!extra
) return Pos
;
367 Pos
= BSTR_UserMarshal(pFlags
, Pos
, &V_BSTR(pvar
));
369 case VT_BSTR
| VT_BYREF
:
370 Pos
= BSTR_UserMarshal(pFlags
, Pos
, V_BSTRREF(pvar
));
372 case VT_VARIANT
| VT_BYREF
:
373 Pos
= VARIANT_UserMarshal(pFlags
, Pos
, V_VARIANTREF(pvar
));
375 case VT_DISPATCH
| VT_BYREF
:
376 FIXME("handle DISPATCH by ref\n");
379 /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */
380 Pos
= dispatch_variant_marshal(pFlags
, Pos
, pvar
);
383 FIXME("handle BRECORD by val\n");
385 case VT_RECORD
| VT_BYREF
:
386 FIXME("handle BRECORD by ref\n");
389 FIXME("handle unknown complex type\n");
392 var
->clSize
= Pos
- Buffer
;
393 TRACE("marshalled size=%ld\n", var
->clSize
);
397 unsigned char * WINAPI
VARIANT_UserUnmarshal(unsigned long *pFlags
, unsigned char *Buffer
, VARIANT
*pvar
)
399 wireVARIANT var
= (wireVARIANT
)Buffer
;
401 unsigned char *Pos
= Buffer
+ VARIANT_wiresize
;
403 TRACE("(%lx,%p,%p)\n", *pFlags
, Buffer
, pvar
);
405 pvar
->n1
.n2
.vt
= var
->rpcReserved
;
406 TRACE("marshalled: clSize=%ld, vt=%04x\n", var
->clSize
, var
->vt
);
407 TRACE("vt=%04x\n", V_VT(pvar
));
408 TRACE("reserved: %d, %d, %d\n", var
->wReserved1
, var
->wReserved2
, var
->wReserved3
);
409 TRACE("val: %ld\n", var
->u
.lVal
);
411 if (var
->vt
== VT_DECIMAL
) {
412 /* special case because decVal is on a different level */
413 pvar
->n1
.decVal
= var
->u
.decVal
;
417 size
= wire_size(V_VT(pvar
));
418 pvar
->n1
.n2
.wReserved1
= var
->wReserved1
;
419 pvar
->n1
.n2
.wReserved2
= var
->wReserved2
;
420 pvar
->n1
.n2
.wReserved3
= var
->wReserved3
;
422 if (var
->vt
& VT_BYREF
) {
423 pvar
->n1
.n2
.n3
.byref
= CoTaskMemAlloc(size
);
424 memcpy(pvar
->n1
.n2
.n3
.byref
, &var
->u
.cVal
, size
);
427 memcpy(&pvar
->n1
.n2
.n3
, &var
->u
.cVal
, size
);
429 if (var
->clSize
<= VARIANT_wiresize
) return Pos
;
433 Pos
= BSTR_UserUnmarshal(pFlags
, Pos
, &V_BSTR(pvar
));
435 case VT_BSTR
| VT_BYREF
:
436 pvar
->n1
.n2
.n3
.byref
= CoTaskMemAlloc(sizeof(BSTR
));
437 *(BSTR
*)pvar
->n1
.n2
.n3
.byref
= NULL
;
438 Pos
= BSTR_UserUnmarshal(pFlags
, Pos
, V_BSTRREF(pvar
));
440 case VT_VARIANT
| VT_BYREF
:
441 pvar
->n1
.n2
.n3
.byref
= CoTaskMemAlloc(sizeof(VARIANT
));
442 Pos
= VARIANT_UserUnmarshal(pFlags
, Pos
, V_VARIANTREF(pvar
));
445 FIXME("handle BRECORD by val\n");
447 case VT_RECORD
| VT_BYREF
:
448 FIXME("handle BRECORD by ref\n");
451 Pos
= dispatch_variant_unmarshal(pFlags
, Pos
, pvar
);
453 case VT_DISPATCH
| VT_BYREF
:
454 FIXME("handle DISPATCH by ref\n");
456 FIXME("handle unknown complex type\n");
459 if (Pos
!= Buffer
+ var
->clSize
) {
460 ERR("size difference during unmarshal\n");
462 return Buffer
+ var
->clSize
;
465 void WINAPI
VARIANT_UserFree(unsigned long *pFlags
, VARIANT
*pvar
)
467 VARTYPE vt
= V_VT(pvar
);
470 TRACE("(%lx,%p)\n", *pFlags
, pvar
);
471 TRACE("vt=%04x\n", V_VT(pvar
));
473 if (vt
& VT_BYREF
) ref
= pvar
->n1
.n2
.n3
.byref
;
479 case VT_BSTR
| VT_BYREF
:
480 BSTR_UserFree(pFlags
, ref
);
482 case VT_VARIANT
| VT_BYREF
:
483 VARIANT_UserFree(pFlags
, ref
);
485 case VT_RECORD
| VT_BYREF
:
486 FIXME("handle BRECORD by ref\n");
489 FIXME("handle unknown complex type\n");
497 /* exactly how Invoke is marshalled is not very clear to me yet,
498 * but the way I've done it seems to work for me */
500 HRESULT CALLBACK
IDispatch_Invoke_Proxy(
506 DISPPARAMS
* pDispParams
,
508 EXCEPINFO
* pExcepInfo
,
513 UINT
* rgVarRefIdx
= NULL
;
514 VARIANTARG
* rgVarRef
= NULL
;
517 TRACE("(%p)->(%ld,%s,%lx,%x,%p,%p,%p,%p)\n", This
,
518 dispIdMember
, debugstr_guid(riid
),
519 lcid
, wFlags
, pDispParams
, pVarResult
,
520 pExcepInfo
, puArgErr
);
522 /* [out] args can't be null, use dummy vars if needed */
523 if (!pVarResult
) pVarResult
= &VarResult
;
525 /* count by-ref args */
526 for (cVarRef
=0,u
=0; u
<pDispParams
->cArgs
; u
++) {
527 VARIANTARG
* arg
= &pDispParams
->rgvarg
[u
];
528 if (V_VT(arg
) & VT_BYREF
) {
533 rgVarRefIdx
= CoTaskMemAlloc(sizeof(UINT
)*cVarRef
);
534 rgVarRef
= CoTaskMemAlloc(sizeof(VARIANTARG
)*cVarRef
);
535 /* make list of by-ref args */
536 for (cVarRef
=0,u
=0; u
<pDispParams
->cArgs
; u
++) {
537 VARIANTARG
* arg
= &pDispParams
->rgvarg
[u
];
538 if (V_VT(arg
) & VT_BYREF
) {
539 rgVarRefIdx
[cVarRef
] = u
;
540 VariantInit(&rgVarRef
[cVarRef
]);
545 /* [out] args still can't be null,
546 * but we can point these anywhere in this case,
547 * since they won't be written to when cVarRef is 0 */
548 rgVarRefIdx
= puArgErr
;
549 rgVarRef
= pVarResult
;
551 TRACE("passed by ref: %d args\n", cVarRef
);
552 hr
= IDispatch_RemoteInvoke_Proxy(This
,
565 for (u
=0; u
<cVarRef
; u
++) {
566 unsigned i
= rgVarRefIdx
[u
];
567 VariantCopy(&pDispParams
->rgvarg
[i
],
569 VariantClear(&rgVarRef
[u
]);
571 CoTaskMemFree(rgVarRef
);
572 CoTaskMemFree(rgVarRefIdx
);
577 HRESULT __RPC_STUB
IDispatch_Invoke_Stub(
583 DISPPARAMS
* pDispParams
,
585 EXCEPINFO
* pExcepInfo
,
589 VARIANTARG
* rgVarRef
)
592 VARIANTARG
*rgvarg
, *arg
;
595 /* let the real Invoke operate on a copy of the in parameters,
596 * so we don't risk losing pointers to allocated memory */
597 rgvarg
= pDispParams
->rgvarg
;
598 arg
= CoTaskMemAlloc(sizeof(VARIANTARG
)*pDispParams
->cArgs
);
599 for (u
=0; u
<pDispParams
->cArgs
; u
++) {
600 VariantInit(&arg
[u
]);
601 VariantCopy(&arg
[u
], &rgvarg
[u
]);
603 pDispParams
->rgvarg
= arg
;
605 /* initialize out parameters, so that they can be marshalled
606 * in case the real Invoke doesn't initialize them */
607 VariantInit(pVarResult
);
608 memset(pExcepInfo
, 0, sizeof(*pExcepInfo
));
611 hr
= IDispatch_Invoke(This
,
621 /* copy ref args to out list */
622 for (u
=0; u
<cVarRef
; u
++) {
623 unsigned i
= rgVarRefIdx
[u
];
624 VariantInit(&rgVarRef
[u
]);
625 VariantCopy(&rgVarRef
[u
], &arg
[i
]);
626 /* clear original if equal, to avoid double-free */
627 if (V_BYREF(&rgVarRef
[u
]) == V_BYREF(&rgvarg
[i
]))
628 VariantClear(&rgvarg
[i
]);
630 /* clear the duplicate argument list */
631 for (u
=0; u
<pDispParams
->cArgs
; u
++) {
632 VariantClear(&arg
[u
]);
634 pDispParams
->rgvarg
= rgvarg
;
642 HRESULT CALLBACK
IEnumVARIANT_Next_Proxy(
650 pCeltFetched
= &fetched
;
651 return IEnumVARIANT_RemoteNext_Proxy(This
,
657 HRESULT __RPC_STUB
IEnumVARIANT_Next_Stub(
665 hr
= IEnumVARIANT_Next(This
,
669 if (hr
== S_OK
) *pCeltFetched
= celt
;
675 HRESULT CALLBACK
ITypeComp_Bind_Proxy(
684 FIXME("not implemented\n");
688 HRESULT __RPC_STUB
ITypeComp_Bind_Stub(
695 LPFUNCDESC
* ppFuncDesc
,
696 LPVARDESC
* ppVarDesc
,
697 ITypeComp
** ppTypeComp
,
698 CLEANLOCALSTORAGE
* pDummy
)
700 FIXME("not implemented\n");
704 HRESULT CALLBACK
ITypeComp_BindType_Proxy(
711 FIXME("not implemented\n");
715 HRESULT __RPC_STUB
ITypeComp_BindType_Stub(
721 FIXME("not implemented\n");
727 HRESULT CALLBACK
ITypeInfo_GetTypeAttr_Proxy(
729 TYPEATTR
** ppTypeAttr
)
731 FIXME("not implemented\n");
735 HRESULT __RPC_STUB
ITypeInfo_GetTypeAttr_Stub(
737 LPTYPEATTR
* ppTypeAttr
,
738 CLEANLOCALSTORAGE
* pDummy
)
740 FIXME("not implemented\n");
744 HRESULT CALLBACK
ITypeInfo_GetFuncDesc_Proxy(
747 FUNCDESC
** ppFuncDesc
)
749 FIXME("not implemented\n");
753 HRESULT __RPC_STUB
ITypeInfo_GetFuncDesc_Stub(
756 LPFUNCDESC
* ppFuncDesc
,
757 CLEANLOCALSTORAGE
* pDummy
)
759 FIXME("not implemented\n");
763 HRESULT CALLBACK
ITypeInfo_GetVarDesc_Proxy(
768 FIXME("not implemented\n");
772 HRESULT __RPC_STUB
ITypeInfo_GetVarDesc_Stub(
775 LPVARDESC
* ppVarDesc
,
776 CLEANLOCALSTORAGE
* pDummy
)
778 FIXME("not implemented\n");
782 HRESULT CALLBACK
ITypeInfo_GetNames_Proxy(
789 FIXME("not implemented\n");
793 HRESULT __RPC_STUB
ITypeInfo_GetNames_Stub(
800 FIXME("not implemented\n");
804 HRESULT CALLBACK
ITypeInfo_GetIDsOfNames_Proxy(
810 FIXME("not implemented\n");
814 HRESULT __RPC_STUB
ITypeInfo_GetIDsOfNames_Stub(
817 FIXME("not implemented\n");
821 HRESULT CALLBACK
ITypeInfo_Invoke_Proxy(
826 DISPPARAMS
* pDispParams
,
828 EXCEPINFO
* pExcepInfo
,
831 FIXME("not implemented\n");
835 HRESULT __RPC_STUB
ITypeInfo_Invoke_Stub(
838 FIXME("not implemented\n");
842 HRESULT CALLBACK
ITypeInfo_GetDocumentation_Proxy(
846 BSTR
* pBstrDocString
,
847 DWORD
* pdwHelpContext
,
850 FIXME("not implemented\n");
854 HRESULT __RPC_STUB
ITypeInfo_GetDocumentation_Stub(
859 BSTR
* pBstrDocString
,
860 DWORD
* pdwHelpContext
,
863 FIXME("not implemented\n");
867 HRESULT CALLBACK
ITypeInfo_GetDllEntry_Proxy(
875 FIXME("not implemented\n");
879 HRESULT __RPC_STUB
ITypeInfo_GetDllEntry_Stub(
888 FIXME("not implemented\n");
892 HRESULT CALLBACK
ITypeInfo_AddressOfMember_Proxy(
898 FIXME("not implemented\n");
902 HRESULT __RPC_STUB
ITypeInfo_AddressOfMember_Stub(
905 FIXME("not implemented\n");
909 HRESULT CALLBACK
ITypeInfo_CreateInstance_Proxy(
915 FIXME("not implemented\n");
919 HRESULT __RPC_STUB
ITypeInfo_CreateInstance_Stub(
924 FIXME("not implemented\n");
928 HRESULT CALLBACK
ITypeInfo_GetContainingTypeLib_Proxy(
933 FIXME("not implemented\n");
937 HRESULT __RPC_STUB
ITypeInfo_GetContainingTypeLib_Stub(
942 FIXME("not implemented\n");
946 void CALLBACK
ITypeInfo_ReleaseTypeAttr_Proxy(
950 FIXME("not implemented\n");
953 HRESULT __RPC_STUB
ITypeInfo_ReleaseTypeAttr_Stub(
956 FIXME("not implemented\n");
960 void CALLBACK
ITypeInfo_ReleaseFuncDesc_Proxy(
964 FIXME("not implemented\n");
967 HRESULT __RPC_STUB
ITypeInfo_ReleaseFuncDesc_Stub(
970 FIXME("not implemented\n");
974 void CALLBACK
ITypeInfo_ReleaseVarDesc_Proxy(
978 FIXME("not implemented\n");
981 HRESULT __RPC_STUB
ITypeInfo_ReleaseVarDesc_Stub(
984 FIXME("not implemented\n");
991 HRESULT CALLBACK
ITypeInfo2_GetDocumentation2_Proxy(
995 BSTR
* pbstrHelpString
,
996 DWORD
* pdwHelpStringContext
,
997 BSTR
* pbstrHelpStringDll
)
999 FIXME("not implemented\n");
1003 HRESULT __RPC_STUB
ITypeInfo2_GetDocumentation2_Stub(
1008 BSTR
* pbstrHelpString
,
1009 DWORD
* pdwHelpStringContext
,
1010 BSTR
* pbstrHelpStringDll
)
1012 FIXME("not implemented\n");
1018 UINT CALLBACK
ITypeLib_GetTypeInfoCount_Proxy(
1021 FIXME("not implemented\n");
1025 HRESULT __RPC_STUB
ITypeLib_GetTypeInfoCount_Stub(
1029 FIXME("not implemented\n");
1033 HRESULT CALLBACK
ITypeLib_GetLibAttr_Proxy(
1035 TLIBATTR
** ppTLibAttr
)
1037 FIXME("not implemented\n");
1041 HRESULT __RPC_STUB
ITypeLib_GetLibAttr_Stub(
1043 LPTLIBATTR
* ppTLibAttr
,
1044 CLEANLOCALSTORAGE
* pDummy
)
1046 FIXME("not implemented\n");
1050 HRESULT CALLBACK
ITypeLib_GetDocumentation_Proxy(
1054 BSTR
* pBstrDocString
,
1055 DWORD
* pdwHelpContext
,
1056 BSTR
* pBstrHelpFile
)
1058 FIXME("not implemented\n");
1062 HRESULT __RPC_STUB
ITypeLib_GetDocumentation_Stub(
1067 BSTR
* pBstrDocString
,
1068 DWORD
* pdwHelpContext
,
1069 BSTR
* pBstrHelpFile
)
1071 FIXME("not implemented\n");
1075 HRESULT CALLBACK
ITypeLib_IsName_Proxy(
1081 FIXME("not implemented\n");
1085 HRESULT __RPC_STUB
ITypeLib_IsName_Stub(
1092 FIXME("not implemented\n");
1096 HRESULT CALLBACK
ITypeLib_FindName_Proxy(
1100 ITypeInfo
** ppTInfo
,
1104 FIXME("not implemented\n");
1108 HRESULT __RPC_STUB
ITypeLib_FindName_Stub(
1112 ITypeInfo
** ppTInfo
,
1117 FIXME("not implemented\n");
1121 void CALLBACK
ITypeLib_ReleaseTLibAttr_Proxy(
1123 TLIBATTR
* pTLibAttr
)
1125 FIXME("not implemented\n");
1128 HRESULT __RPC_STUB
ITypeLib_ReleaseTLibAttr_Stub(
1131 FIXME("not implemented\n");
1138 HRESULT CALLBACK
ITypeLib2_GetLibStatistics_Proxy(
1140 ULONG
* pcUniqueNames
,
1141 ULONG
* pcchUniqueNames
)
1143 FIXME("not implemented\n");
1147 HRESULT __RPC_STUB
ITypeLib2_GetLibStatistics_Stub(
1149 ULONG
* pcUniqueNames
,
1150 ULONG
* pcchUniqueNames
)
1152 FIXME("not implemented\n");
1156 HRESULT CALLBACK
ITypeLib2_GetDocumentation2_Proxy(
1160 BSTR
* pbstrHelpString
,
1161 DWORD
* pdwHelpStringContext
,
1162 BSTR
* pbstrHelpStringDll
)
1164 FIXME("not implemented\n");
1168 HRESULT __RPC_STUB
ITypeLib2_GetDocumentation2_Stub(
1173 BSTR
* pbstrHelpString
,
1174 DWORD
* pdwHelpStringContext
,
1175 BSTR
* pbstrHelpStringDll
)
1177 FIXME("not implemented\n");