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");