2 * Copyright 2001 Hidenori Takeshima
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "winnls.h" /* for PRIMARYLANGID */
25 #include "winreg.h" /* for HKEY_LOCAL_MACHINE */
31 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
34 typedef struct CTypeInfo2Impl
36 ICOM_VFIELD(ITypeInfo2
);
43 static OLECHAR
* olestrdup(OLECHAR
* psz
)
48 cb
= (lstrlenW(psz
)+1) * sizeof(OLECHAR
);
49 pret
= (OLECHAR
*)HeapAlloc( GetProcessHeap(), 0, cb
);
51 memcpy( pret
, psz
, cb
);
55 static HRESULT
CTypeInfo2Impl_Construct(
56 CTypeInfo2Impl
* This
,INTERFACEDATA
* pifd
,LCID lcid
)
60 const METHODDATA
* pmsrc
;
62 const PARAMDATA
* pPsrc
;
64 This
->ifd
.pmethdata
= (METHODDATA
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(METHODDATA
)*pifd
->cMembers
);
65 if ( This
->ifd
.pmethdata
== NULL
) return E_OUTOFMEMORY
;
66 This
->ifd
.cMembers
= pifd
->cMembers
;
67 for ( n
= 0; n
< pifd
->cMembers
; n
++ )
69 pmdst
= &This
->ifd
.pmethdata
[n
];
70 pmsrc
= &pifd
->pmethdata
[n
];
72 pmdst
->szName
= olestrdup(pmsrc
->szName
);
73 if ( pmdst
->szName
== NULL
) return E_OUTOFMEMORY
;
75 pmdst
->dispid
= pmsrc
->dispid
;
76 pmdst
->iMeth
= pmsrc
->iMeth
;
77 pmdst
->cc
= pmsrc
->cc
;
78 pmdst
->cArgs
= pmsrc
->cArgs
;
79 pmdst
->wFlags
= pmsrc
->wFlags
;
80 pmdst
->vtReturn
= pmsrc
->vtReturn
;
82 if ( pmsrc
->cArgs
<= 0 ) continue;
83 pmdst
->ppdata
= (PARAMDATA
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(PARAMDATA
)*pmsrc
->cArgs
);
84 if ( pmdst
->ppdata
== NULL
) return E_OUTOFMEMORY
;
86 for ( k
= 0; k
< pmsrc
->cArgs
; k
++ )
88 pPdst
= &pmdst
->ppdata
[k
];
89 pPsrc
= &pmsrc
->ppdata
[k
];
90 pPdst
->szName
= olestrdup(pPsrc
->szName
);
91 if ( pPdst
->szName
== NULL
) return E_OUTOFMEMORY
;
92 pPdst
->vt
= pPsrc
->vt
;
101 static void CTypeInfo2Impl_Destruct(CTypeInfo2Impl
* This
)
107 if ( This
->ifd
.pmethdata
!= NULL
)
109 for ( n
= 0; n
< This
->ifd
.cMembers
; n
++ )
111 pm
= &This
->ifd
.pmethdata
[n
];
112 if ( pm
->szName
!= NULL
)
113 HeapFree(GetProcessHeap(),0,pm
->szName
);
114 if ( pm
->ppdata
== NULL
) continue;
116 for ( k
= 0; k
< pm
->cArgs
; k
++ )
119 if ( pP
->szName
!= NULL
)
120 HeapFree(GetProcessHeap(),0,pP
->szName
);
122 HeapFree(GetProcessHeap(),0,pm
->ppdata
);
124 HeapFree(GetProcessHeap(),0,This
->ifd
.pmethdata
);
125 This
->ifd
.pmethdata
= NULL
;
129 /****************************************************************************/
131 static const METHODDATA
* CTypeInfo2Impl_SearchMethodByName(
132 CTypeInfo2Impl
* This
,const OLECHAR
* pName
)
137 for ( n
= 0; n
< This
->ifd
.cMembers
; n
++ )
139 pm
= &This
->ifd
.pmethdata
[n
];
140 if ( !lstrcmpiW(pm
->szName
,pName
) )
147 static const METHODDATA
* CTypeInfo2Impl_SearchMethodByDispIDAndFlags(
148 CTypeInfo2Impl
* This
,DISPID dispid
,UINT16 wFlags
)
153 for ( n
= 0; n
< This
->ifd
.cMembers
; n
++ )
155 pm
= &This
->ifd
.pmethdata
[n
];
156 if ( (pm
->dispid
== dispid
) && (pm
->wFlags
& wFlags
) )
164 static int CTypeInfo2Impl_SearchParamByName(
165 const METHODDATA
* pm
,const OLECHAR
* pName
)
170 for ( k
= 0; k
< pm
->cArgs
; k
++ )
173 if ( !lstrcmpiW(pP
->szName
,pName
) )
181 /****************************************************************************/
183 static HRESULT WINAPI
CTypeInfo2Impl_fnQueryInterface(
184 ITypeInfo2
* iface
,REFIID riid
,void** ppvobj
)
186 ICOM_THIS(CTypeInfo2Impl
,iface
);
188 TRACE("(%p)->(IID: %s)\n",This
,debugstr_guid(riid
));
191 if ( IsEqualIID(riid
, &IID_IUnknown
) ||
192 IsEqualIID(riid
, &IID_ITypeInfo
) ||
193 IsEqualIID(riid
, &IID_ITypeInfo2
) )
195 *ppvobj
= (void*)iface
;
196 ITypeInfo2_AddRef(iface
);
200 return E_NOINTERFACE
;
203 static ULONG WINAPI
CTypeInfo2Impl_fnAddRef(ITypeInfo2
* iface
)
205 ICOM_THIS(CTypeInfo2Impl
,iface
);
210 static ULONG WINAPI
CTypeInfo2Impl_fnRelease(ITypeInfo2
* iface
)
212 ICOM_THIS(CTypeInfo2Impl
,iface
);
214 if ( -- This
->ref
> 0 ) return This
->ref
;
217 CTypeInfo2Impl_Destruct(This
);
218 HeapFree(GetProcessHeap(),0,This
);
222 static HRESULT WINAPI
CTypeInfo2Impl_fnGetTypeAttr(
223 ITypeInfo2
* iface
,LPTYPEATTR
* ppTypeAttr
)
225 ICOM_THIS(CTypeInfo2Impl
,iface
);
228 FIXME("(%p)\n",This
);
230 if ( ppTypeAttr
== NULL
)
232 pta
= (TYPEATTR
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(TYPEATTR
));
233 if ( pta
== NULL
) return E_OUTOFMEMORY
;
236 pta
->lcid
= This
->lcid
;
237 pta
->memidConstructor
= MEMBERID_NIL
;
238 pta
->memidDestructor
= MEMBERID_NIL
;
239 pta
->lpstrSchema
= NULL
;
240 pta
->cbSizeInstance
= 0;
242 pta
->cFuncs
= This
->ifd
.cMembers
;
245 pta
->cbSizeVft
= sizeof(DWORD
)*This
->ifd
.cMembers
;
246 pta
->cbAlignment
= sizeof(DWORD
);
248 pta
->wMajorVerNum
= 1;
249 pta
->wMinorVerNum
= 0;
250 ZeroMemory( &pta
->idldescType
, sizeof(pta
->idldescType
) );
256 static HRESULT WINAPI
CTypeInfo2Impl_fnGetTypeComp(
257 ITypeInfo2
* iface
,ITypeComp
** ppTComp
)
259 ICOM_THIS(CTypeInfo2Impl
,iface
);
261 FIXME("(%p) stub!\n",This
);
266 static HRESULT WINAPI
CTypeInfo2Impl_fnGetFuncDesc(
267 ITypeInfo2
* iface
,UINT index
,LPFUNCDESC
* ppFuncDesc
)
269 ICOM_THIS(CTypeInfo2Impl
,iface
);
271 FIXME("(%p) stub!\n",This
);
276 static HRESULT WINAPI
CTypeInfo2Impl_fnGetVarDesc(
277 ITypeInfo2
* iface
,UINT index
,LPVARDESC
* ppVarDesc
)
279 ICOM_THIS(CTypeInfo2Impl
,iface
);
281 FIXME("(%p) stub!\n",This
);
286 static HRESULT WINAPI
CTypeInfo2Impl_fnGetNames(
287 ITypeInfo2
* iface
, MEMBERID memid
,BSTR
* rgBstrNames
,
288 UINT cMaxNames
, UINT
* pcNames
)
290 ICOM_THIS(CTypeInfo2Impl
,iface
);
292 FIXME("(%p) stub!\n",This
);
297 static HRESULT WINAPI
CTypeInfo2Impl_fnGetRefTypeOfImplType(
298 ITypeInfo2
* iface
,UINT index
,HREFTYPE
* pRefType
)
300 ICOM_THIS(CTypeInfo2Impl
,iface
);
302 FIXME("(%p) stub!\n",This
);
307 static HRESULT WINAPI
CTypeInfo2Impl_fnGetImplTypeFlags(
308 ITypeInfo2
* iface
,UINT index
,INT
* pImplTypeFlags
)
310 ICOM_THIS(CTypeInfo2Impl
,iface
);
312 FIXME("(%p) stub!\n",This
);
317 static HRESULT WINAPI
CTypeInfo2Impl_fnGetIDsOfNames(
318 ITypeInfo2
* iface
,LPOLESTR
* rgszNames
,UINT cNames
,MEMBERID
* pMemId
)
320 ICOM_THIS(CTypeInfo2Impl
,iface
);
321 const METHODDATA
* pm
;
325 TRACE("(%p,%s,%u,%p)\n",This
,debugstr_w(*rgszNames
),cNames
,pMemId
);
327 if ( rgszNames
== NULL
|| pMemId
== NULL
) return E_POINTER
;
328 if ( cNames
<= 0 ) return E_INVALIDARG
;
329 for ( n
= 0; n
< cNames
; n
++ )
331 if ( rgszNames
[n
] == NULL
) return E_POINTER
;
334 pm
= CTypeInfo2Impl_SearchMethodByName(This
,rgszNames
[0]);
335 if ( pm
== NULL
) return DISP_E_UNKNOWNNAME
;
336 pMemId
[0] = (MEMBERID
)pm
->dispid
;
338 for ( n
= 1; n
< cNames
; n
++ )
340 index
= CTypeInfo2Impl_SearchParamByName(pm
,rgszNames
[n
]);
341 if ( index
< 0 ) return DISP_E_UNKNOWNNAME
;
342 pMemId
[n
] = (MEMBERID
)index
;
348 static HRESULT WINAPI
CTypeInfo2Impl_fnInvoke(
349 ITypeInfo2
* iface
,VOID
* punk
,MEMBERID memid
,
350 UINT16 wFlags
,DISPPARAMS
* pDispParams
,VARIANT
* pVarResult
,
351 EXCEPINFO
* pExcepInfo
,UINT
* pArgErr
)
353 ICOM_THIS(CTypeInfo2Impl
,iface
);
354 const METHODDATA
* pm
;
363 FIXME("(%p,%p,%ld,%08x,%p,%p,%p,%p)\n",
364 This
,punk
,(long)memid
,(int)wFlags
,
365 pDispParams
,pVarResult
,pExcepInfo
,pArgErr
);
367 if ( punk
== NULL
|| pArgErr
== NULL
)
370 pm
= CTypeInfo2Impl_SearchMethodByDispIDAndFlags(
374 ERR("did not find member id %ld, flags %d!\n", (long)memid
, (int)wFlags
);
375 return DISP_E_MEMBERNOTFOUND
;
378 cargs
= pm
->cArgs
+ 1;
379 pargs
= (DWORD
*)HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD
)*(pm
->cArgs
+2) );
380 if ( pargs
== NULL
) { hr
= E_OUTOFMEMORY
; goto err_invoke
; }
382 V_VT(&varError
) = VT_ERROR
;
383 pargs
[0] = (DWORD
)punk
;
384 for ( n
= 1; n
<= (int)pm
->cArgs
; n
++ )
385 pargs
[n
] = (DWORD
)&varError
; /* FIXME? */
387 if ( (int)pDispParams
->cArgs
> (int)pm
->cArgs
)
389 hr
= E_FAIL
; /* FIXME? */
393 for ( n
= 1; n
<= (int)pm
->cArgs
; n
++ )
395 if ( n
<= (int)pDispParams
->cNamedArgs
)
397 /* FIXME - handle named args. */
398 /* FIXME - check types. */
400 /* pDispParams->rgdispidNamedArgs */
401 /* pDispParams->cNamedArgs */
402 FIXME("named args - %d\n",n
);
403 pargs
[n
] = V_UNION(&pDispParams
->rgvarg
[pDispParams
->cArgs
-n
],lVal
);
407 /* FIXME - check types. */
408 pargs
[n
] = V_UNION(&pDispParams
->rgvarg
[pDispParams
->cArgs
-n
],lVal
);
412 VariantInit( &varRet
);
413 if ( pm
->vtReturn
!= VT_EMPTY
&&
414 (!(wFlags
& (DISPATCH_PROPERTYPUT
|DISPATCH_PROPERTYPUTREF
))) )
416 if ( pVarResult
!= NULL
)
418 pargs
[cargs
] = (DWORD
)pVarResult
;
422 pargs
[cargs
] = (DWORD
)(&varRet
);
428 (*(DWORD
***)punk
)[pm
->iMeth
],
429 pm
->cc
, cargs
, pargs
);
430 VariantClear( &varRet
);
432 if ( res
== (DWORD
)-1 ) /* FIXME? */
440 HeapFree( GetProcessHeap(), 0, pargs
);
445 static HRESULT WINAPI
CTypeInfo2Impl_fnGetDocumentation(
447 MEMBERID memid
, BSTR
* pBstrName
, BSTR
* pBstrDocString
,
448 DWORD
* pdwHelpContext
, BSTR
* pBstrHelpFile
)
450 ICOM_THIS(CTypeInfo2Impl
,iface
);
452 FIXME("(%p) stub!\n",This
);
457 static HRESULT WINAPI
CTypeInfo2Impl_fnGetDllEntry(
458 ITypeInfo2
* iface
,MEMBERID memid
,
459 INVOKEKIND invKind
,BSTR
* pBstrDllName
,BSTR
* pBstrName
,
462 ICOM_THIS(CTypeInfo2Impl
,iface
);
464 FIXME("(%p) stub!\n",This
);
469 static HRESULT WINAPI
CTypeInfo2Impl_fnGetRefTypeInfo(
470 ITypeInfo2
* iface
,HREFTYPE hRefType
,ITypeInfo
** ppTInfo
)
472 ICOM_THIS(CTypeInfo2Impl
,iface
);
474 FIXME("(%p) stub!\n",This
);
479 static HRESULT WINAPI
CTypeInfo2Impl_fnAddressOfMember(
481 MEMBERID memid
,INVOKEKIND invKind
,PVOID
* ppv
)
483 ICOM_THIS(CTypeInfo2Impl
,iface
);
485 FIXME("(%p) stub!\n",This
);
490 static HRESULT WINAPI
CTypeInfo2Impl_fnCreateInstance(
492 IUnknown
* punk
,REFIID riid
,VOID
** ppvObj
)
494 ICOM_THIS(CTypeInfo2Impl
,iface
);
496 FIXME("(%p) stub!\n",This
);
501 static HRESULT WINAPI
CTypeInfo2Impl_fnGetMops(
502 ITypeInfo2
* iface
,MEMBERID memid
,BSTR
* pBstrMops
)
504 ICOM_THIS(CTypeInfo2Impl
,iface
);
506 FIXME("(%p) stub!\n",This
);
511 static HRESULT WINAPI
CTypeInfo2Impl_fnGetContainingTypeLib(
512 ITypeInfo2
* iface
,ITypeLib
** ppTLib
,UINT
* pIndex
)
514 ICOM_THIS(CTypeInfo2Impl
,iface
);
516 FIXME("(%p) stub!\n",This
);
521 static HRESULT WINAPI
CTypeInfo2Impl_fnReleaseTypeAttr(
522 ITypeInfo2
* iface
,TYPEATTR
* pTypeAttr
)
524 ICOM_THIS(CTypeInfo2Impl
,iface
);
526 FIXME("(%p)\n",This
);
528 if ( pTypeAttr
!= NULL
)
529 HeapFree(GetProcessHeap(),0,pTypeAttr
);
534 static HRESULT WINAPI
CTypeInfo2Impl_fnReleaseFuncDesc(
535 ITypeInfo2
* iface
,FUNCDESC
* pFuncDesc
)
537 ICOM_THIS(CTypeInfo2Impl
,iface
);
539 FIXME("(%p) stub!\n",This
);
544 static HRESULT WINAPI
CTypeInfo2Impl_fnReleaseVarDesc(
545 ITypeInfo2
* iface
,VARDESC
* pVarDesc
)
547 ICOM_THIS(CTypeInfo2Impl
,iface
);
549 FIXME("(%p) stub!\n",This
);
554 static HRESULT WINAPI
CTypeInfo2Impl_fnGetTypeKind(
555 ITypeInfo2
* iface
,TYPEKIND
* pTypeKind
)
557 ICOM_THIS(CTypeInfo2Impl
,iface
);
559 FIXME("(%p) stub!\n",This
);
564 static HRESULT WINAPI
CTypeInfo2Impl_fnGetTypeFlags(
565 ITypeInfo2
* iface
,UINT
* pTypeFlags
)
567 ICOM_THIS(CTypeInfo2Impl
,iface
);
569 FIXME("(%p) stub!\n",This
);
574 static HRESULT WINAPI
CTypeInfo2Impl_fnGetFuncIndexOfMemId(
576 MEMBERID memid
,INVOKEKIND invKind
,UINT
* pFuncIndex
)
578 ICOM_THIS(CTypeInfo2Impl
,iface
);
580 FIXME("(%p) stub!\n",This
);
585 static HRESULT WINAPI
CTypeInfo2Impl_fnGetVarIndexOfMemId(
587 MEMBERID memid
,UINT
* pVarIndex
)
589 ICOM_THIS(CTypeInfo2Impl
,iface
);
591 FIXME("(%p) stub!\n",This
);
596 static HRESULT WINAPI
CTypeInfo2Impl_fnGetCustData(
597 ITypeInfo2
* iface
,REFGUID guid
,VARIANT
* pVarVal
)
599 ICOM_THIS(CTypeInfo2Impl
,iface
);
601 FIXME("(%p) stub!\n",This
);
606 static HRESULT WINAPI
CTypeInfo2Impl_fnGetFuncCustData(
607 ITypeInfo2
* iface
,UINT index
,REFGUID guid
,VARIANT
* pVarVal
)
609 ICOM_THIS(CTypeInfo2Impl
,iface
);
611 FIXME("(%p) stub!\n",This
);
616 static HRESULT WINAPI
CTypeInfo2Impl_fnGetParamCustData(
617 ITypeInfo2
* iface
,UINT indexFunc
,UINT indexParam
,
618 REFGUID guid
,VARIANT
* pVarVal
)
620 ICOM_THIS(CTypeInfo2Impl
,iface
);
622 FIXME("(%p) stub!\n",This
);
627 static HRESULT WINAPI
CTypeInfo2Impl_fnGetVarCustData(
628 ITypeInfo2
* iface
,UINT index
,REFGUID guid
,VARIANT
* pVarVal
)
630 ICOM_THIS(CTypeInfo2Impl
,iface
);
632 FIXME("(%p) stub!\n",This
);
637 static HRESULT WINAPI
CTypeInfo2Impl_fnGetImplTypeCustData(
638 ITypeInfo2
* iface
,UINT index
,REFGUID guid
,VARIANT
* pVarVal
)
640 ICOM_THIS(CTypeInfo2Impl
,iface
);
642 FIXME("(%p) stub!\n",This
);
647 static HRESULT WINAPI
CTypeInfo2Impl_fnGetDocumentation2(
648 ITypeInfo2
* iface
,MEMBERID memid
,LCID lcid
,
649 BSTR
* pbstrHelpString
,DWORD
* pdwHelpStringContext
,BSTR
* pbstrHelpStringDll
)
651 ICOM_THIS(CTypeInfo2Impl
,iface
);
653 FIXME("(%p) stub!\n",This
);
658 static HRESULT WINAPI
CTypeInfo2Impl_fnGetAllCustData(
659 ITypeInfo2
* iface
,CUSTDATA
* pCustData
)
661 ICOM_THIS(CTypeInfo2Impl
,iface
);
663 FIXME("(%p) stub!\n",This
);
668 static HRESULT WINAPI
CTypeInfo2Impl_fnGetAllFuncCustData(
669 ITypeInfo2
* iface
,UINT index
,CUSTDATA
* pCustData
)
671 ICOM_THIS(CTypeInfo2Impl
,iface
);
673 FIXME("(%p) stub!\n",This
);
678 static HRESULT WINAPI
CTypeInfo2Impl_fnGetAllParamCustData(
679 ITypeInfo2
* iface
,UINT indexFunc
,UINT indexParam
,CUSTDATA
* pCustData
)
681 ICOM_THIS(CTypeInfo2Impl
,iface
);
683 FIXME("(%p) stub!\n",This
);
688 static HRESULT WINAPI
CTypeInfo2Impl_fnGetAllVarCustData(
689 ITypeInfo2
* iface
,UINT index
,CUSTDATA
* pCustData
)
691 ICOM_THIS(CTypeInfo2Impl
,iface
);
693 FIXME("(%p) stub!\n",This
);
698 static HRESULT WINAPI
CTypeInfo2Impl_fnGetAllImplTypeCustData(
699 ITypeInfo2
* iface
,UINT index
,CUSTDATA
* pCustData
)
701 ICOM_THIS(CTypeInfo2Impl
,iface
);
703 FIXME("(%p) stub!\n",This
);
708 static ICOM_VTABLE(ITypeInfo2
) itypeinfo2
=
710 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
713 CTypeInfo2Impl_fnQueryInterface
,
714 CTypeInfo2Impl_fnAddRef
,
715 CTypeInfo2Impl_fnRelease
,
717 CTypeInfo2Impl_fnGetTypeAttr
,
718 CTypeInfo2Impl_fnGetTypeComp
,
719 CTypeInfo2Impl_fnGetFuncDesc
,
720 CTypeInfo2Impl_fnGetVarDesc
,
721 CTypeInfo2Impl_fnGetNames
,
722 CTypeInfo2Impl_fnGetRefTypeOfImplType
,
723 CTypeInfo2Impl_fnGetImplTypeFlags
,
724 CTypeInfo2Impl_fnGetIDsOfNames
,
725 CTypeInfo2Impl_fnInvoke
,
726 CTypeInfo2Impl_fnGetDocumentation
,
727 CTypeInfo2Impl_fnGetDllEntry
,
728 CTypeInfo2Impl_fnGetRefTypeInfo
,
729 CTypeInfo2Impl_fnAddressOfMember
,
730 CTypeInfo2Impl_fnCreateInstance
,
731 CTypeInfo2Impl_fnGetMops
,
732 CTypeInfo2Impl_fnGetContainingTypeLib
,
733 CTypeInfo2Impl_fnReleaseTypeAttr
,
734 CTypeInfo2Impl_fnReleaseFuncDesc
,
735 CTypeInfo2Impl_fnReleaseVarDesc
,
737 CTypeInfo2Impl_fnGetTypeKind
,
738 CTypeInfo2Impl_fnGetTypeFlags
,
739 CTypeInfo2Impl_fnGetFuncIndexOfMemId
,
740 CTypeInfo2Impl_fnGetVarIndexOfMemId
,
741 CTypeInfo2Impl_fnGetCustData
,
742 CTypeInfo2Impl_fnGetFuncCustData
,
743 CTypeInfo2Impl_fnGetParamCustData
,
744 CTypeInfo2Impl_fnGetVarCustData
,
745 CTypeInfo2Impl_fnGetImplTypeCustData
,
746 CTypeInfo2Impl_fnGetDocumentation2
,
747 CTypeInfo2Impl_fnGetAllCustData
,
748 CTypeInfo2Impl_fnGetAllFuncCustData
,
749 CTypeInfo2Impl_fnGetAllParamCustData
,
750 CTypeInfo2Impl_fnGetAllVarCustData
,
751 CTypeInfo2Impl_fnGetAllImplTypeCustData
,
754 /*****************************************************************************/
756 HRESULT WINAPI
CreateDispTypeInfo(
762 CTypeInfo2Impl
* This
;
764 if ( ppinfo
== NULL
)
767 This
= (CTypeInfo2Impl
*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(CTypeInfo2Impl
));
768 if ( This
== NULL
) return E_OUTOFMEMORY
;
769 ICOM_VTBL(This
) = &itypeinfo2
;
772 hr
= CTypeInfo2Impl_Construct(This
,pifd
,lcid
);
775 IUnknown_Release((IUnknown
*)This
);
778 *ppinfo
= (ITypeInfo
*)This
;