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.