Alex Villacís Lasso wrote:
--- wine-20050830-cvs/dlls/oleaut32/typelib.c 2005-09-21 10:39:22.000000000 -0500 +++ wine-20050830-cvs-patch/dlls/oleaut32/typelib.c 2005-09-24 20:34:32.000000000 -0500 @@ -5207,9 +5207,11 @@ ITypeInfoImpl *This = (ITypeInfoImpl *)iface; HRESULT result = E_FAIL;
- if (hRefType == -1 && + if ((hRefType == -1 && (((ITypeInfoImpl*) This)->TypeAttr.typekind == TKIND_DISPATCH) && - (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL)) + (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL)) || + ((((ITypeInfoImpl*) This)->TypeAttr.typekind == TKIND_DISPATCH) && + (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags & TYPEFLAG_FDISPATCHABLE))) { /* when we meet a DUAL dispinterface, we must create the interface * version of it.
This patch executes the "create interface" code when typekind == TKIND_DISPATCH and wTypeFlags has TYPEFLAG_FDISPATCHABLE, regardless of the value of hRefType, in addition to the previous condition. With this patch, the native oleaut32 requirement is removed. The typelib test still passes - not that it actually tests the change in code (more on this later).
This patch looks pretty good, but I can't see the difference between TKIND_DISPATCH and TYPEFLAG_FDISPATCHABLE on MSDN. They look like they mean the same thing. Have you seen a typelib with one and not the other? Also, you can remove all of the casts of This while you're changing that if statement because they are unnecessary.
UPDATE: The OleCreateDefaultHandler routine seems to be in error in returning the CLASS_E_NOAGGREGATION error in the DBGRID32.OCX case. If I read the comment correctly (and *please* tell me so if I am not), the aggregation case (pUnkOuter != NULL) is forbidden when riid is other than IID_IUnknown, and therefore the test is reversed from what it should be:
--- wine-20050830-cvs/dlls/ole32/defaulthandler.c 2005-09-23 10:51:36.000000000 -0500 +++ wine-20050830-cvs-patch/dlls/ole32/defaulthandler.c 2005-09-25 19:19:31.000000000 -0500 @@ -1422,7 +1422,7 @@ * This is necessary because it's the only time the non-delegating * IUnknown pointer can be returned to the outside. */ - if (pUnkOuter && IsEqualIID(&IID_IUnknown, riid)) + if (pUnkOuter && !IsEqualIID(&IID_IUnknown, riid)) return CLASS_E_NOAGGREGATION;
/*
This patch is obviously correct.
This patch allows the DBGrid test to move to the next error: the DataCache_GetAdvise function crashes after the above patch is applied, because this->sinkInterface is NULL at the time of call, but it does not make any check for it:
--- wine-20050830-cvs/dlls/ole32/datacache.c 2005-07-27 10:49:38.000000000 -0500 +++ wine-20050830-cvs-patch/dlls/ole32/datacache.c 2005-09-25 19:45:48.000000000 -0500 @@ -1390,9 +1390,11 @@
if (ppAdvSink!=NULL) { - IAdviseSink_QueryInterface(this->sinkInterface, + if (this->sinkInterface != NULL) + IAdviseSink_QueryInterface(this->sinkInterface, &IID_IAdviseSink, (void**)ppAdvSink); + else *ppAdvSink = NULL; }
return S_OK;
With the above two patches, the DBGrid test sheds all dependencies on native oleaut32 *and* ole32. In addition, the SIAP package is freed from the dependence on native ole32. I will try to investigate later the remaining dependency on native oleaut32.
This patch is also correct. Please send all of these patches to wine-patches. -- Rob Shearman