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
26 #define NONAMELESSUNION
27 #define NONAMELESSSTRUCT
38 #include "wine/debug.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(ole);
42 /* FIXME: not supposed to be here */
44 const CLSID CLSID_PSDispatch = {
45 0x20420, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46}
48 static CStdPSFactoryBuffer PSFactoryBuffer;
50 CSTDSTUBBUFFERRELEASE(&PSFactoryBuffer)
52 extern const ExtendedProxyFileInfo oaidl_ProxyFileInfo;
54 const ProxyFileInfo* OLEAUT32_ProxyFileList[] = {
59 HRESULT OLEAUTPS_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
61 return NdrDllGetClassObject(rclsid, riid, ppv, OLEAUT32_ProxyFileList,
62 &CLSID_PSDispatch, &PSFactoryBuffer);
65 /* CLEANLOCALSTORAGE */
66 /* I'm not sure how this is supposed to work yet */
68 unsigned long WINAPI CLEANLOCALSTORAGE_UserSize(unsigned long *pFlags, unsigned long Start, CLEANLOCALSTORAGE *pstg)
70 return Start + sizeof(DWORD);
73 unsigned char * WINAPI CLEANLOCALSTORAGE_UserMarshal(unsigned long *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstg)
76 return Buffer + sizeof(DWORD);
79 unsigned char * WINAPI CLEANLOCALSTORAGE_UserUnmarshal(unsigned long *pFlags, unsigned char *Buffer, CLEANLOCALSTORAGE *pstr)
81 return Buffer + sizeof(DWORD);
84 void WINAPI CLEANLOCALSTORAGE_UserFree(unsigned long *pFlags, CLEANLOCALSTORAGE *pstr)
90 unsigned long WINAPI BSTR_UserSize(unsigned long *pFlags, unsigned long Start, BSTR *pstr)
92 TRACE("(%lx,%ld,%p) => %p\n", *pFlags, Start, pstr, *pstr);
93 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
94 Start += sizeof(FLAGGED_WORD_BLOB) + sizeof(OLECHAR) * (SysStringLen(*pstr) - 1);
95 TRACE("returning %ld\n", Start);
99 unsigned char * WINAPI BSTR_UserMarshal(unsigned long *pFlags, unsigned char *Buffer, BSTR *pstr)
101 wireBSTR str = (wireBSTR)Buffer;
103 TRACE("(%lx,%p,%p) => %p\n", *pFlags, Buffer, pstr, *pstr);
104 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
106 str->clSize = SysStringLen(*pstr);
108 memcpy(&str->asData, *pstr, sizeof(OLECHAR) * str->clSize);
109 return Buffer + sizeof(FLAGGED_WORD_BLOB) + sizeof(OLECHAR) * (str->clSize - 1);
112 unsigned char * WINAPI BSTR_UserUnmarshal(unsigned long *pFlags, unsigned char *Buffer, BSTR *pstr)
114 wireBSTR str = (wireBSTR)Buffer;
115 TRACE("(%lx,%p,%p) => %p\n", *pFlags, Buffer, pstr, *pstr);
117 SysReAllocStringLen(pstr, (OLECHAR*)&str->asData, str->clSize);
120 SysFreeString(*pstr);
123 if (*pstr) TRACE("string=%s\n", debugstr_w(*pstr));
124 return Buffer + sizeof(FLAGGED_WORD_BLOB) + sizeof(OLECHAR) * (str->clSize - 1);
127 void WINAPI BSTR_UserFree(unsigned long *pFlags, BSTR *pstr)
129 TRACE("(%lx,%p) => %p\n", *pFlags, pstr, *pstr);
131 SysFreeString(*pstr);
137 /* I'm not too sure how to do this yet */
139 #define VARIANT_wiresize sizeof(struct _wireVARIANT)
141 static unsigned wire_size(VARTYPE vt)
143 if (vt & VT_ARRAY) return 0;
145 switch (vt & ~VT_BYREF) {
154 return sizeof(SHORT);
162 return sizeof(FLOAT);
164 return sizeof(DOUBLE);
166 return sizeof(VARIANT_BOOL);
168 return sizeof(SCODE);
174 return sizeof(DECIMAL);
183 FIXME("unhandled VT %d\n", vt);
188 static unsigned wire_extra(unsigned long *pFlags, VARIANT *pvar)
193 if (V_ISARRAY(pvar)) {
194 FIXME("wire-size safearray\n");
197 switch (V_VT(pvar)) {
199 return BSTR_UserSize(pFlags, 0, &V_BSTR(pvar));
200 case VT_BSTR | VT_BYREF:
201 return BSTR_UserSize(pFlags, 0, V_BSTRREF(pvar));
203 case VT_SAFEARRAY | VT_BYREF:
204 FIXME("wire-size safearray\n");
206 case VT_VARIANT | VT_BYREF:
207 return VARIANT_UserSize(pFlags, 0, V_VARIANTREF(pvar));
210 /* find the buffer size of the marshalled dispatch interface */
211 hr = CoGetMarshalSizeMax(&size, &IID_IDispatch, (IUnknown*)V_DISPATCH(pvar), LOWORD(*pFlags), NULL, MSHLFLAGS_NORMAL);
213 ERR("Dispatch variant buffer size calculation failed, HRESULT=0x%lx\n", hr);
216 size += sizeof(ULONG); /* we have to store the buffersize in the stream */
217 TRACE("wire-size extra of dispatch variant is %ld\n", size);
220 FIXME("wire-size record\n");
227 /* helper: called for VT_DISPATCH variants to marshal the IDispatch* into the buffer. returns Buffer on failure, new position otherwise */
228 static unsigned char* dispatch_variant_marshal(unsigned long *pFlags, unsigned char *Buffer, VARIANT *pvar) {
231 void *working_memlocked;
232 unsigned char *oldpos;
236 TRACE("pFlags=%ld, Buffer=%p, pvar=%p\n", *pFlags, Buffer, pvar);
240 /* CoMarshalInterface needs a stream, whereas at this level we are operating in terms of buffers.
241 * We create a stream on an HGLOBAL, so we can simply do a memcpy to move it to the buffer.
242 * in rpcrt4/ndr_ole.c, a simple IStream implementation is wrapped around the buffer object,
243 * but that would be overkill here, hence this implementation. We save the size because the unmarshal
244 * code has no way to know how long the marshalled buffer is. */
246 size = wire_extra(pFlags, pvar);
248 working_mem = GlobalAlloc(0, size);
249 if (!working_mem) return oldpos;
251 hr = CreateStreamOnHGlobal(working_mem, TRUE, &working);
253 GlobalFree(working_mem);
257 hr = CoMarshalInterface(working, &IID_IDispatch, (IUnknown*)V_DISPATCH(pvar), LOWORD(*pFlags), NULL, MSHLFLAGS_NORMAL);
259 IStream_Release(working); /* this also releases the hglobal */
263 working_memlocked = GlobalLock(working_mem);
264 memcpy(Buffer, &size, sizeof(ULONG)); /* copy the buffersize */
265 Buffer += sizeof(ULONG);
266 memcpy(Buffer, working_memlocked, size);
267 GlobalUnlock(working_mem);
269 IStream_Release(working);
271 TRACE("done, size=%ld\n", sizeof(ULONG) + size);
272 return Buffer + sizeof(ULONG) + size;
275 /* helper: called for VT_DISPATCH variants to unmarshal the buffer back into a dispatch variant. returns Buffer on failure, new position otherwise */
276 static unsigned char *dispatch_variant_unmarshal(unsigned long *pFlags, unsigned char *Buffer, VARIANT *pvar) {
279 void *working_memlocked;
280 unsigned char *oldpos;
284 TRACE("pFlags=%ld, Buffer=%p, pvar=%p\n", *pFlags, Buffer, pvar);
288 /* get the buffersize */
289 memcpy(&size, Buffer, sizeof(ULONG));
290 TRACE("buffersize=%ld\n", size);
291 Buffer += sizeof(ULONG);
293 working_mem = GlobalAlloc(0, size);
294 if (!working_mem) return oldpos;
296 hr = CreateStreamOnHGlobal(working_mem, TRUE, &working);
298 GlobalFree(working_mem);
302 working_memlocked = GlobalLock(working_mem);
304 /* now we copy the contents of the marshalling buffer to working_memlocked, unlock it, and demarshal the stream */
305 memcpy(working_memlocked, Buffer, size);
306 GlobalUnlock(working_mem);
308 hr = CoUnmarshalInterface(working, &IID_IDispatch, (void**)&V_DISPATCH(pvar));
310 IStream_Release(working);
314 IStream_Release(working); /* this also frees the underlying hglobal */
316 TRACE("done, processed=%ld bytes\n", sizeof(ULONG) + size);
317 return Buffer + sizeof(ULONG) + size;
321 unsigned long WINAPI VARIANT_UserSize(unsigned long *pFlags, unsigned long Start, VARIANT *pvar)
323 TRACE("(%lx,%ld,%p)\n", *pFlags, Start, pvar);
324 TRACE("vt=%04x\n", V_VT(pvar));
325 Start += VARIANT_wiresize + wire_extra(pFlags, pvar);
326 TRACE("returning %ld\n", Start);
330 unsigned char * WINAPI VARIANT_UserMarshal(unsigned long *pFlags, unsigned char *Buffer, VARIANT *pvar)
332 wireVARIANT var = (wireVARIANT)Buffer;
333 unsigned size, extra;
334 unsigned char *Pos = Buffer + VARIANT_wiresize;
336 TRACE("(%lx,%p,%p)\n", *pFlags, Buffer, pvar);
337 TRACE("vt=%04x\n", V_VT(pvar));
339 memset(var, 0, sizeof(*var));
340 var->clSize = sizeof(*var);
341 var->vt = pvar->n1.n2.vt;
343 var->rpcReserved = var->vt;
344 if ((var->vt & VT_ARRAY) ||
345 ((var->vt & VT_TYPEMASK) == VT_SAFEARRAY))
346 var->vt = VT_ARRAY | (var->vt & VT_BYREF);
348 if (var->vt == VT_DECIMAL) {
349 /* special case because decVal is on a different level */
350 var->u.decVal = pvar->n1.decVal;
354 size = wire_size(V_VT(pvar));
355 extra = wire_extra(pFlags, pvar);
356 var->wReserved1 = pvar->n1.n2.wReserved1;
357 var->wReserved2 = pvar->n1.n2.wReserved2;
358 var->wReserved3 = pvar->n1.n2.wReserved3;
360 if (var->vt & VT_BYREF)
361 memcpy(&var->u.cVal, pvar->n1.n2.n3.byref, size);
363 memcpy(&var->u.cVal, &pvar->n1.n2.n3, size);
365 if (!extra) return Pos;
369 Pos = BSTR_UserMarshal(pFlags, Pos, &V_BSTR(pvar));
371 case VT_BSTR | VT_BYREF:
372 Pos = BSTR_UserMarshal(pFlags, Pos, V_BSTRREF(pvar));
374 case VT_VARIANT | VT_BYREF:
375 Pos = VARIANT_UserMarshal(pFlags, Pos, V_VARIANTREF(pvar));
377 case VT_DISPATCH | VT_BYREF:
378 FIXME("handle DISPATCH by ref\n");
381 /* this should probably call WdtpInterfacePointer_UserMarshal in ole32.dll */
382 Pos = dispatch_variant_marshal(pFlags, Pos, pvar);
385 FIXME("handle BRECORD by val\n");
387 case VT_RECORD | VT_BYREF:
388 FIXME("handle BRECORD by ref\n");
391 FIXME("handle unknown complex type\n");
394 var->clSize = Pos - Buffer;
395 TRACE("marshalled size=%ld\n", var->clSize);
399 unsigned char * WINAPI VARIANT_UserUnmarshal(unsigned long *pFlags, unsigned char *Buffer, VARIANT *pvar)
401 wireVARIANT var = (wireVARIANT)Buffer;
403 unsigned char *Pos = Buffer + VARIANT_wiresize;
405 TRACE("(%lx,%p,%p)\n", *pFlags, Buffer, pvar);
407 pvar->n1.n2.vt = var->rpcReserved;
408 TRACE("marshalled: clSize=%ld, vt=%04x\n", var->clSize, var->vt);
409 TRACE("vt=%04x\n", V_VT(pvar));
410 TRACE("reserved: %d, %d, %d\n", var->wReserved1, var->wReserved2, var->wReserved3);
411 TRACE("val: %ld\n", var->u.lVal);
413 if (var->vt == VT_DECIMAL) {
414 /* special case because decVal is on a different level */
415 pvar->n1.decVal = var->u.decVal;
419 size = wire_size(V_VT(pvar));
420 pvar->n1.n2.wReserved1 = var->wReserved1;
421 pvar->n1.n2.wReserved2 = var->wReserved2;
422 pvar->n1.n2.wReserved3 = var->wReserved3;
424 if (var->vt & VT_BYREF) {
425 pvar->n1.n2.n3.byref = CoTaskMemAlloc(size);
426 memcpy(pvar->n1.n2.n3.byref, &var->u.cVal, size);
429 memcpy(&pvar->n1.n2.n3, &var->u.cVal, size);
431 if (var->clSize <= VARIANT_wiresize) return Pos;
435 Pos = BSTR_UserUnmarshal(pFlags, Pos, &V_BSTR(pvar));
437 case VT_BSTR | VT_BYREF:
438 pvar->n1.n2.n3.byref = CoTaskMemAlloc(sizeof(BSTR));
439 *(BSTR*)pvar->n1.n2.n3.byref = NULL;
440 Pos = BSTR_UserUnmarshal(pFlags, Pos, V_BSTRREF(pvar));
442 case VT_VARIANT | VT_BYREF:
443 pvar->n1.n2.n3.byref = CoTaskMemAlloc(sizeof(VARIANT));
444 Pos = VARIANT_UserUnmarshal(pFlags, Pos, V_VARIANTREF(pvar));
447 FIXME("handle BRECORD by val\n");
449 case VT_RECORD | VT_BYREF:
450 FIXME("handle BRECORD by ref\n");
453 Pos = dispatch_variant_unmarshal(pFlags, Pos, pvar);
455 case VT_DISPATCH | VT_BYREF:
456 FIXME("handle DISPATCH by ref\n");
458 FIXME("handle unknown complex type\n");
461 if (Pos != Buffer + var->clSize) {
462 ERR("size difference during unmarshal\n");
464 return Buffer + var->clSize;
467 void WINAPI VARIANT_UserFree(unsigned long *pFlags, VARIANT *pvar)
469 VARTYPE vt = V_VT(pvar);
472 TRACE("(%lx,%p)\n", *pFlags, pvar);
473 TRACE("vt=%04x\n", V_VT(pvar));
475 if (vt & VT_BYREF) ref = pvar->n1.n2.n3.byref;
481 case VT_BSTR | VT_BYREF:
482 BSTR_UserFree(pFlags, ref);
484 case VT_VARIANT | VT_BYREF:
485 VARIANT_UserFree(pFlags, ref);
487 case VT_RECORD | VT_BYREF:
488 FIXME("handle BRECORD by ref\n");
491 FIXME("handle unknown complex type\n");
499 /* exactly how Invoke is marshalled is not very clear to me yet,
500 * but the way I've done it seems to work for me */
502 HRESULT CALLBACK IDispatch_Invoke_Proxy(
508 DISPPARAMS* pDispParams,
510 EXCEPINFO* pExcepInfo,
515 UINT* rgVarRefIdx = NULL;
516 VARIANTARG* rgVarRef = NULL;
519 TRACE("(%p)->(%ld,%s,%lx,%x,%p,%p,%p,%p)\n", This,
520 dispIdMember, debugstr_guid(riid),
521 lcid, wFlags, pDispParams, pVarResult,
522 pExcepInfo, puArgErr);
524 /* [out] args can't be null, use dummy vars if needed */
525 if (!pVarResult) pVarResult = &VarResult;
527 /* count by-ref args */
528 for (cVarRef=0,u=0; u<pDispParams->cArgs; u++) {
529 VARIANTARG* arg = &pDispParams->rgvarg[u];
530 if (V_ISBYREF(arg)) {
535 rgVarRefIdx = CoTaskMemAlloc(sizeof(UINT)*cVarRef);
536 rgVarRef = CoTaskMemAlloc(sizeof(VARIANTARG)*cVarRef);
537 /* make list of by-ref args */
538 for (cVarRef=0,u=0; u<pDispParams->cArgs; u++) {
539 VARIANTARG* arg = &pDispParams->rgvarg[u];
540 if (V_ISBYREF(arg)) {
541 rgVarRefIdx[cVarRef] = u;
542 VariantInit(&rgVarRef[cVarRef]);
547 /* [out] args still can't be null,
548 * but we can point these anywhere in this case,
549 * since they won't be written to when cVarRef is 0 */
550 rgVarRefIdx = puArgErr;
551 rgVarRef = pVarResult;
553 TRACE("passed by ref: %d args\n", cVarRef);
554 hr = IDispatch_RemoteInvoke_Proxy(This,
567 for (u=0; u<cVarRef; u++) {
568 unsigned i = rgVarRefIdx[u];
569 VariantCopy(&pDispParams->rgvarg[i],
571 VariantClear(&rgVarRef[u]);
573 CoTaskMemFree(rgVarRef);
574 CoTaskMemFree(rgVarRefIdx);
579 HRESULT __RPC_STUB IDispatch_Invoke_Stub(
585 DISPPARAMS* pDispParams,
587 EXCEPINFO* pExcepInfo,
591 VARIANTARG* rgVarRef)
594 VARIANTARG *rgvarg, *arg;
597 /* let the real Invoke operate on a copy of the in parameters,
598 * so we don't risk losing pointers to allocated memory */
599 rgvarg = pDispParams->rgvarg;
600 arg = CoTaskMemAlloc(sizeof(VARIANTARG)*pDispParams->cArgs);
601 for (u=0; u<pDispParams->cArgs; u++) {
602 VariantInit(&arg[u]);
603 VariantCopy(&arg[u], &rgvarg[u]);
605 pDispParams->rgvarg = arg;
607 /* initialize out parameters, so that they can be marshalled
608 * in case the real Invoke doesn't initialize them */
609 VariantInit(pVarResult);
610 memset(pExcepInfo, 0, sizeof(*pExcepInfo));
613 hr = IDispatch_Invoke(This,
623 /* copy ref args to out list */
624 for (u=0; u<cVarRef; u++) {
625 unsigned i = rgVarRefIdx[u];
626 VariantInit(&rgVarRef[u]);
627 VariantCopy(&rgVarRef[u], &arg[i]);
628 /* clear original if equal, to avoid double-free */
629 if (V_BYREF(&rgVarRef[u]) == V_BYREF(&rgvarg[i]))
630 VariantClear(&rgvarg[i]);
632 /* clear the duplicate argument list */
633 for (u=0; u<pDispParams->cArgs; u++) {
634 VariantClear(&arg[u]);
636 pDispParams->rgvarg = rgvarg;
644 HRESULT CALLBACK IEnumVARIANT_Next_Proxy(
652 pCeltFetched = &fetched;
653 return IEnumVARIANT_RemoteNext_Proxy(This,
659 HRESULT __RPC_STUB IEnumVARIANT_Next_Stub(
667 hr = IEnumVARIANT_Next(This,
671 if (hr == S_OK) *pCeltFetched = celt;
677 HRESULT CALLBACK ITypeComp_Bind_Proxy(
686 FIXME("not implemented\n");
690 HRESULT __RPC_STUB ITypeComp_Bind_Stub(
697 LPFUNCDESC* ppFuncDesc,
698 LPVARDESC* ppVarDesc,
699 ITypeComp** ppTypeComp,
700 CLEANLOCALSTORAGE* pDummy)
702 FIXME("not implemented\n");
706 HRESULT CALLBACK ITypeComp_BindType_Proxy(
713 FIXME("not implemented\n");
717 HRESULT __RPC_STUB ITypeComp_BindType_Stub(
723 FIXME("not implemented\n");
729 HRESULT CALLBACK ITypeInfo_GetTypeAttr_Proxy(
731 TYPEATTR** ppTypeAttr)
733 FIXME("not implemented\n");
737 HRESULT __RPC_STUB ITypeInfo_GetTypeAttr_Stub(
739 LPTYPEATTR* ppTypeAttr,
740 CLEANLOCALSTORAGE* pDummy)
742 FIXME("not implemented\n");
746 HRESULT CALLBACK ITypeInfo_GetFuncDesc_Proxy(
749 FUNCDESC** ppFuncDesc)
751 FIXME("not implemented\n");
755 HRESULT __RPC_STUB ITypeInfo_GetFuncDesc_Stub(
758 LPFUNCDESC* ppFuncDesc,
759 CLEANLOCALSTORAGE* pDummy)
761 FIXME("not implemented\n");
765 HRESULT CALLBACK ITypeInfo_GetVarDesc_Proxy(
770 FIXME("not implemented\n");
774 HRESULT __RPC_STUB ITypeInfo_GetVarDesc_Stub(
777 LPVARDESC* ppVarDesc,
778 CLEANLOCALSTORAGE* pDummy)
780 FIXME("not implemented\n");
784 HRESULT CALLBACK ITypeInfo_GetNames_Proxy(
791 FIXME("not implemented\n");
795 HRESULT __RPC_STUB ITypeInfo_GetNames_Stub(
802 FIXME("not implemented\n");
806 HRESULT CALLBACK ITypeInfo_GetIDsOfNames_Proxy(
812 FIXME("not implemented\n");
816 HRESULT __RPC_STUB ITypeInfo_GetIDsOfNames_Stub(
819 FIXME("not implemented\n");
823 HRESULT CALLBACK ITypeInfo_Invoke_Proxy(
828 DISPPARAMS* pDispParams,
830 EXCEPINFO* pExcepInfo,
833 FIXME("not implemented\n");
837 HRESULT __RPC_STUB ITypeInfo_Invoke_Stub(
840 FIXME("not implemented\n");
844 HRESULT CALLBACK ITypeInfo_GetDocumentation_Proxy(
848 BSTR* pBstrDocString,
849 DWORD* pdwHelpContext,
852 FIXME("not implemented\n");
856 HRESULT __RPC_STUB ITypeInfo_GetDocumentation_Stub(
861 BSTR* pBstrDocString,
862 DWORD* pdwHelpContext,
865 FIXME("not implemented\n");
869 HRESULT CALLBACK ITypeInfo_GetDllEntry_Proxy(
877 FIXME("not implemented\n");
881 HRESULT __RPC_STUB ITypeInfo_GetDllEntry_Stub(
890 FIXME("not implemented\n");
894 HRESULT CALLBACK ITypeInfo_AddressOfMember_Proxy(
900 FIXME("not implemented\n");
904 HRESULT __RPC_STUB ITypeInfo_AddressOfMember_Stub(
907 FIXME("not implemented\n");
911 HRESULT CALLBACK ITypeInfo_CreateInstance_Proxy(
917 FIXME("not implemented\n");
921 HRESULT __RPC_STUB ITypeInfo_CreateInstance_Stub(
926 FIXME("not implemented\n");
930 HRESULT CALLBACK ITypeInfo_GetContainingTypeLib_Proxy(
935 FIXME("not implemented\n");
939 HRESULT __RPC_STUB ITypeInfo_GetContainingTypeLib_Stub(
944 FIXME("not implemented\n");
948 void CALLBACK ITypeInfo_ReleaseTypeAttr_Proxy(
952 FIXME("not implemented\n");
955 HRESULT __RPC_STUB ITypeInfo_ReleaseTypeAttr_Stub(
958 FIXME("not implemented\n");
962 void CALLBACK ITypeInfo_ReleaseFuncDesc_Proxy(
966 FIXME("not implemented\n");
969 HRESULT __RPC_STUB ITypeInfo_ReleaseFuncDesc_Stub(
972 FIXME("not implemented\n");
976 void CALLBACK ITypeInfo_ReleaseVarDesc_Proxy(
980 FIXME("not implemented\n");
983 HRESULT __RPC_STUB ITypeInfo_ReleaseVarDesc_Stub(
986 FIXME("not implemented\n");
993 HRESULT CALLBACK ITypeInfo2_GetDocumentation2_Proxy(
997 BSTR* pbstrHelpString,
998 DWORD* pdwHelpStringContext,
999 BSTR* pbstrHelpStringDll)
1001 FIXME("not implemented\n");
1005 HRESULT __RPC_STUB ITypeInfo2_GetDocumentation2_Stub(
1010 BSTR* pbstrHelpString,
1011 DWORD* pdwHelpStringContext,
1012 BSTR* pbstrHelpStringDll)
1014 FIXME("not implemented\n");
1020 UINT CALLBACK ITypeLib_GetTypeInfoCount_Proxy(
1023 FIXME("not implemented\n");
1027 HRESULT __RPC_STUB ITypeLib_GetTypeInfoCount_Stub(
1031 FIXME("not implemented\n");
1035 HRESULT CALLBACK ITypeLib_GetLibAttr_Proxy(
1037 TLIBATTR** ppTLibAttr)
1039 FIXME("not implemented\n");
1043 HRESULT __RPC_STUB ITypeLib_GetLibAttr_Stub(
1045 LPTLIBATTR* ppTLibAttr,
1046 CLEANLOCALSTORAGE* pDummy)
1048 FIXME("not implemented\n");
1052 HRESULT CALLBACK ITypeLib_GetDocumentation_Proxy(
1056 BSTR* pBstrDocString,
1057 DWORD* pdwHelpContext,
1058 BSTR* pBstrHelpFile)
1060 FIXME("not implemented\n");
1064 HRESULT __RPC_STUB ITypeLib_GetDocumentation_Stub(
1069 BSTR* pBstrDocString,
1070 DWORD* pdwHelpContext,
1071 BSTR* pBstrHelpFile)
1073 FIXME("not implemented\n");
1077 HRESULT CALLBACK ITypeLib_IsName_Proxy(
1083 FIXME("not implemented\n");
1087 HRESULT __RPC_STUB ITypeLib_IsName_Stub(
1094 FIXME("not implemented\n");
1098 HRESULT CALLBACK ITypeLib_FindName_Proxy(
1102 ITypeInfo** ppTInfo,
1106 FIXME("not implemented\n");
1110 HRESULT __RPC_STUB ITypeLib_FindName_Stub(
1114 ITypeInfo** ppTInfo,
1119 FIXME("not implemented\n");
1123 void CALLBACK ITypeLib_ReleaseTLibAttr_Proxy(
1125 TLIBATTR* pTLibAttr)
1127 FIXME("not implemented\n");
1130 HRESULT __RPC_STUB ITypeLib_ReleaseTLibAttr_Stub(
1133 FIXME("not implemented\n");
1140 HRESULT CALLBACK ITypeLib2_GetLibStatistics_Proxy(
1142 ULONG* pcUniqueNames,
1143 ULONG* pcchUniqueNames)
1145 FIXME("not implemented\n");
1149 HRESULT __RPC_STUB ITypeLib2_GetLibStatistics_Stub(
1151 ULONG* pcUniqueNames,
1152 ULONG* pcchUniqueNames)
1154 FIXME("not implemented\n");
1158 HRESULT CALLBACK ITypeLib2_GetDocumentation2_Proxy(
1162 BSTR* pbstrHelpString,
1163 DWORD* pdwHelpStringContext,
1164 BSTR* pbstrHelpStringDll)
1166 FIXME("not implemented\n");
1170 HRESULT __RPC_STUB ITypeLib2_GetDocumentation2_Stub(
1175 BSTR* pbstrHelpString,
1176 DWORD* pdwHelpStringContext,
1177 BSTR* pbstrHelpStringDll)
1179 FIXME("not implemented\n");