- AddRef type info stored in StdDispatch. - Don't use outer unknown in StdDispatch.
diff --git a/dlls/oleaut32/dispatch.c b/dlls/oleaut32/dispatch.c index a3ff490..73b34dc 100644 --- a/dlls/oleaut32/dispatch.c +++ b/dlls/oleaut32/dispatch.c
@@ -160,6 +160,9 @@ * RETURNS * Success: S_OK. ppunkStdDisp contains the new object. * Failure: An HRESULT error code. + * + * NOTES + * Outer unknown appears to be completely ignored. */ HRESULT WINAPI CreateStdDispatch( IUnknown* punkOuter, @@ -235,7 +238,6 @@ typedef struct { ICOM_VFIELD(IDispatch); - IUnknown * outerUnknown; void * pvThis; ITypeInfo * pTypeInfo; ULONG ref; @@ -254,9 +256,6 @@ ICOM_THIS(StdDispatch, iface); TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppvObject); - if (This->outerUnknown) - return IUnknown_QueryInterface(This->outerUnknown, riid, ppvObject); - if (IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown)) { @@ -276,11 +275,8 @@ { ICOM_THIS(StdDispatch, iface); TRACE("()\n"); - This->ref++; - if (This->outerUnknown) - return IUnknown_AddRef(This->outerUnknown); - else - return This->ref; + + return ++This->ref; } /****************************************************************************** @@ -294,15 +290,13 @@ ULONG ret; TRACE("(%p)->()\n", This); - This->ref--; + ret = This->ref--; - if (This->outerUnknown) - ret = IUnknown_Release(This->outerUnknown); - else - ret = This->ref; - - if (This->ref <= 0) + if (This->ref == 0) + { + ITypeInfo_Release(This->pTypeInfo); CoTaskMemFree(This); + } return ret; } @@ -469,10 +463,13 @@ return (IDispatch *)pStdDispatch; pStdDispatch->lpVtbl = &StdDispatch_VTable; - pStdDispatch->outerUnknown = punkOuter; pStdDispatch->pvThis = pvThis; pStdDispatch->pTypeInfo = pTypeInfo; pStdDispatch->ref = 1; + /* we keep a reference to the type info so prevent it from + * being destroyed until we are done with it */ + ITypeInfo_AddRef(pTypeInfo); + return (IDispatch *)pStdDispatch; }