comctl32.dll: Running siap and modules under wine, first steps
Robert Shearman
rob at codeweavers.com
Wed Sep 28 10:41:06 CDT 2005
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
More information about the wine-devel
mailing list