[OLE] ITypeComp Support
Robert Shearman
R.J.Shearman at warwick.ac.uk
Thu Jun 26 06:35:47 CDT 2003
This patch makes VB6 run a bit better.
Changelog:
- Silence the FIXME about constructor/destructor since it is wrong for 99.9%
of cases (if MS will ever use the feature at all)
- Added stubs for ITypeComp interface in ITypeLib
- Implementation of ITypeComp in ITypeInfo
Rob
-------------- next part --------------
Index: wine/dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.96
diff -u -r1.96 typelib.c
--- wine/dlls/oleaut32/typelib.c 15 May 2003 22:58:17 -0000 1.96
+++ wine/dlls/oleaut32/typelib.c 25 Jun 2003 22:23:51 -0000
@@ -632,6 +632,7 @@
typedef struct tagITypeLibImpl
{
ICOM_VFIELD(ITypeLib2);
+ ICOM_VTABLE(ITypeComp) * lpVtblTypeComp;
UINT ref;
TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */
@@ -654,6 +655,10 @@
} ITypeLibImpl;
static struct ICOM_VTABLE(ITypeLib2) tlbvt;
+static struct ICOM_VTABLE(ITypeComp) tlbtcvt;
+
+#define _ITypeComp_Offset(impl) ((int)(&(((impl*)0)->lpVtblTypeComp)))
+#define ICOM_THIS_From_ITypeComp(impl, iface) impl* This = (impl*)(((char*)iface)-_ITypeComp_Offset(impl))
/* ITypeLib methods */
static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength);
@@ -734,6 +739,7 @@
typedef struct tagITypeInfoImpl
{
ICOM_VFIELD(ITypeInfo2);
+ ICOM_VTABLE(ITypeComp) * lpVtblTypeComp;
UINT ref;
TYPEATTR TypeAttr ; /* _lots_ of type information. */
ITypeLibImpl * pTypeLib; /* back pointer to typelib */
@@ -762,6 +768,7 @@
} ITypeInfoImpl;
static struct ICOM_VTABLE(ITypeInfo2) tinfvt;
+static struct ICOM_VTABLE(ITypeComp) tcompvt;
static ITypeInfo2 * WINAPI ITypeInfo_Constructor();
@@ -1846,7 +1853,7 @@
ptiRet->pTypeLib = pLibInfo;
ptiRet->index=count;
/* fill in the typeattr fields */
- FIXME("Assign constructor/destructor memid\n");
+ WARN("Assign constructor/destructor memid\n");
MSFT_ReadGuid(&ptiRet->TypeAttr.guid, tiBase.posguid, pcx);
ptiRet->TypeAttr.lcid=pLibInfo->LibAttr.lcid; /* FIXME: correct? */
@@ -2076,6 +2083,7 @@
if (!pTypeLibImpl) return NULL;
pTypeLibImpl->lpVtbl = &tlbvt;
+ pTypeLibImpl->lpVtblTypeComp = &tlbtcvt;
pTypeLibImpl->ref = 1;
/* get pointer to beginning of typelib data */
@@ -3389,8 +3397,12 @@
ITypeComp **ppTComp)
{
ICOM_THIS( ITypeLibImpl, iface);
- FIXME("(%p): stub!\n",This);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n",This,ppTComp);
+ *ppTComp = (ITypeComp *)&This->lpVtblTypeComp;
+ ITypeComp_AddRef(*ppTComp);
+
+ return S_OK;
}
/* ITypeLib::GetDocumentation
@@ -3749,6 +3761,64 @@
ITypeLib2_fnGetAllCustData
};
+
+static HRESULT WINAPI ITypeLibComp_fnQueryInterface(ITypeComp * iface, REFIID riid, LPVOID * ppv)
+{
+ ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
+
+ return ITypeInfo_QueryInterface((ITypeInfo *)This, riid, ppv);
+}
+
+static ULONG WINAPI ITypeLibComp_fnAddRef(ITypeComp * iface)
+{
+ ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
+
+ return ITypeInfo_AddRef((ITypeInfo *)This);
+}
+
+static ULONG WINAPI ITypeLibComp_fnRelease(ITypeComp * iface)
+{
+ ICOM_THIS_From_ITypeComp(ITypeLibImpl, iface);
+
+ return ITypeInfo_Release((ITypeInfo *)This);
+}
+
+static HRESULT WINAPI ITypeLibComp_fnBind(
+ ITypeComp * iface,
+ OLECHAR * szName,
+ unsigned long lHash,
+ unsigned short wFlags,
+ ITypeInfo ** ppTInfo,
+ DESCKIND * pDescKind,
+ BINDPTR * pBindPtr)
+{
+ FIXME("(%s, %lx, 0x%x, %p, %p, %p): stub\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ITypeLibComp_fnBindType(
+ ITypeComp * iface,
+ OLECHAR * szName,
+ unsigned long lHash,
+ ITypeInfo ** ppTInfo,
+ ITypeComp ** ppTComp)
+{
+ FIXME("(%s, %lx, %p, %p): stub\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
+ return E_NOTIMPL;
+}
+
+static ICOM_VTABLE(ITypeComp) tlbtcvt =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ ITypeLibComp_fnQueryInterface,
+ ITypeLibComp_fnAddRef,
+ ITypeLibComp_fnRelease,
+
+ ITypeLibComp_fnBind,
+ ITypeLibComp_fnBindType
+};
+
/*================== ITypeInfo(2) Methods ===================================*/
static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void)
{
@@ -3758,6 +3828,7 @@
if (pTypeInfoImpl)
{
pTypeInfoImpl->lpVtbl = &tinfvt;
+ pTypeInfoImpl->lpVtblTypeComp = &tcompvt;
pTypeInfoImpl->ref=1;
}
TRACE("(%p)\n", pTypeInfoImpl);
@@ -3866,7 +3937,11 @@
ITypeComp * *ppTComp)
{
ICOM_THIS( ITypeInfoImpl, iface);
- FIXME("(%p) stub!\n", This);
+
+ TRACE("(%p)->(%p) stub!\n", This, ppTComp);
+
+ *ppTComp = (ITypeComp *)&This->lpVtblTypeComp;
+ ITypeComp_AddRef(*ppTComp);
return S_OK;
}
@@ -5370,4 +5445,125 @@
ITypeInfo2_fnGetAllParamCustData,
ITypeInfo2_fnGetAllVarCustData,
ITypeInfo2_fnGetAllImplTypeCustData,
+};
+
+static HRESULT WINAPI ITypeComp_fnQueryInterface(ITypeComp * iface, REFIID riid, LPVOID * ppv)
+{
+ ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
+
+ return ITypeInfo_QueryInterface((ITypeInfo *)This, riid, ppv);
+}
+
+static ULONG WINAPI ITypeComp_fnAddRef(ITypeComp * iface)
+{
+ ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
+
+ return ITypeInfo_AddRef((ITypeInfo *)This);
+}
+
+static ULONG WINAPI ITypeComp_fnRelease(ITypeComp * iface)
+{
+ ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
+
+ return ITypeInfo_Release((ITypeInfo *)This);
+}
+
+static HRESULT WINAPI ITypeComp_fnBind(
+ ITypeComp * iface,
+ OLECHAR * szName,
+ unsigned long lHash,
+ unsigned short wFlags,
+ ITypeInfo ** ppTInfo,
+ DESCKIND * pDescKind,
+ BINDPTR * pBindPtr)
+{
+ ICOM_THIS_From_ITypeComp(ITypeInfoImpl, iface);
+ TLBFuncDesc * pFDesc;
+ TLBVarDesc * pVDesc;
+
+ TRACE("(%s, %lx, 0x%x, %p, %p, %p)\n", debugstr_w(szName), lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
+
+ for(pFDesc = This->funclist; pFDesc; pFDesc = pFDesc->next)
+ if (pFDesc->funcdesc.invkind & wFlags)
+ if (!strcmpW(pFDesc->Name, szName)) {
+ break;
+ }
+
+ if (pFDesc)
+ {
+ *pDescKind = DESCKIND_FUNCDESC;
+ pBindPtr->lpfuncdesc = &pFDesc->funcdesc;
+ *ppTInfo = (ITypeInfo *)&This->lpVtbl;
+ return S_OK;
+ } else {
+ if (!(wFlags & ~(INVOKE_PROPERTYGET)))
+ {
+ for(pVDesc = This->varlist; pVDesc; pVDesc = pVDesc->next) {
+ if (!strcmpW(pVDesc->Name, szName)) {
+ *pDescKind = DESCKIND_VARDESC;
+ pBindPtr->lpvardesc = &pVDesc->vardesc;
+ *ppTInfo = (ITypeInfo *)&This->lpVtbl;
+ return S_OK;
+ }
+ }
+ }
+ }
+ /* not found, look for it in inherited interfaces */
+ if ((This->TypeAttr.typekind == TKIND_INTERFACE) && This->TypeAttr.cImplTypes) {
+ /* recursive search */
+ ITypeInfo *pTInfo;
+ ITypeComp *pTComp;
+ HRESULT hr;
+ hr=ITypeInfo_GetRefTypeInfo((ITypeInfo *)&This->lpVtbl, This->impltypelist->hRef, &pTInfo);
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_GetTypeComp(pTInfo,&pTComp);
+ ITypeInfo_Release(pTInfo);
+ }
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeComp_Bind(pTComp, szName, lHash, wFlags, ppTInfo, pDescKind, pBindPtr);
+ ITypeComp_Release(pTComp);
+ return hr;
+ }
+ WARN("Could not search inherited interface!\n");
+ }
+ ERR("did not find member with name %s, flags 0x%x!\n", debugstr_w(szName), wFlags);
+ *pDescKind = DESCKIND_NONE;
+ pBindPtr->lpfuncdesc = NULL;
+ *ppTInfo = NULL;
+ return DISP_E_MEMBERNOTFOUND;
+}
+
+static HRESULT WINAPI ITypeComp_fnBindType(
+ ITypeComp * iface,
+ OLECHAR * szName,
+ unsigned long lHash,
+ ITypeInfo ** ppTInfo,
+ ITypeComp ** ppTComp)
+{
+ TRACE("(%s, %lx, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp);
+
+ /* strange behaviour (does nothing) but like the
+ * original */
+
+ if (!ppTInfo || !ppTComp)
+ return E_POINTER;
+
+ *ppTInfo = NULL;
+ *ppTComp = NULL;
+
+ return S_OK;
+}
+
+static ICOM_VTABLE(ITypeComp) tcompvt =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+
+ ITypeComp_fnQueryInterface,
+ ITypeComp_fnAddRef,
+ ITypeComp_fnRelease,
+
+ ITypeComp_fnBind,
+ ITypeComp_fnBindType
};
More information about the wine-patches
mailing list