howto fix bug 13462
Rob Shearman
robertshearman at gmail.com
Wed Oct 1 07:40:32 CDT 2008
2008/9/29 Louis. Lenders <xerox_xerox2000 at yahoo.co.uk>:
> Rob Shearman <robertshearman <at> gmail.com> writes:
>
> Hi Rob, i think i got the test ready now, i'll send it when the defenitions
> are
> in place in ctxtcall.idl. Now still strugling how to fix the bug.
>
> I fixed up the patch below, also by looking how things are done in similar
> places in wine-code. With patch applied I can see that
> ContextCallback_ContextCallback and ContextCallback_Release are called from
> the
> application (tested with NASA WorldWind), and the simple stubs are enough to
> let
> the app continue fine. But i'm not sure if everything is 100% ok. Is this
> what
> you more or less meant in your first comment?
Looks good apart from some small issues below:
> diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
> index 37907ec..a1f41fd 100644
> --- a/dlls/ole32/compobj.c
> +++ b/dlls/ole32/compobj.c
> @@ -55,6 +55,7 @@
> #include "objbase.h"
> #include "ole2.h"
> #include "ole2ver.h"
> +#include "ctxtcall.h"
>
> #include "compobj_private.h"
>
> @@ -3615,25 +3616,39 @@ HRESULT WINAPI CoRegisterChannelHook(REFGUID
> guidExtension, IChannelHook *pChann
> typedef struct Context
> {
> const IComThreadingInfoVtbl *lpVtbl;
> + const IContextCallback *lpVtblIContextCallback;
This should be of type IContextCallbackVtbl. Also
s/lpVtblIContextCallback/lpVtblContextCallback/.
> LONG refs;
> APTTYPE apttype;
> } Context;
>
> +static inline Context *impl_from_Context(IComThreadingInfo *iface)
> +{
> + return (Context *)((char*)iface - FIELD_OFFSET(Context, lpVtbl));
> +}
> +
> static HRESULT WINAPI Context_QueryInterface(IComThreadingInfo *iface,
> REFIID riid, LPVOID *ppv)
> {
> + Context* This=impl_from_Context((IComThreadingInfo*) iface);
> *ppv = NULL;
>
> if (IsEqualIID(riid, &IID_IComThreadingInfo) ||
> IsEqualIID(riid, &IID_IUnknown))
> {
> *ppv = iface;
> - IUnknown_AddRef(iface);
> - return S_OK;
> }
> + else if(IsEqualIID(riid, &IID_IContextCallback))
> + {
> + *ppv = &This->lpVtblIContextCallback;
> + }
> + else
> + {
> + FIXME("interface not implemented %s\n", debugstr_guid(riid));
> + return E_NOINTERFACE;
> + }
>
> - FIXME("interface not implemented %s\n", debugstr_guid(riid));
> - return E_NOINTERFACE;
> -}
> + IUnknown_AddRef(iface);
> + return S_OK;
> +}
>
> static ULONG WINAPI Context_AddRef(IComThreadingInfo *iface)
> {
> @@ -3691,6 +3706,31 @@ static HRESULT WINAPI
> Context_SetCurrentLogicalThreadId(IComThreadingInfo *iface
> return E_NOTIMPL;
> }
>
> +
> +static HRESULT WINAPI ContextCallback_QueryInterface(IContextCallback
> *iface, REFIID riid, LPVOID *ppv)
> +{
> + FIXME("\n");
> + return E_NOTIMPL;
> +}
> +
> +static ULONG WINAPI ContextCallback_AddRef(IContextCallback *iface)
> +{
> + FIXME("\n");
> + return E_NOTIMPL;
> +}
> +
> +static ULONG WINAPI ContextCallback_Release(IContextCallback *iface)
> +{
> + FIXME("\n");
> + return E_NOTIMPL;
> +}
These functions should be called Context_IContextCallback_* instead of
ContextCallback_* to show that they are part of the same object as the
Context_* functions. Also, you should be able to easily implement
these using impl_from_Context(IComThreadingInfo *iface) and
Context_QueryInterface, Context_AddRef and Context_Release.
> +
> +static HRESULT WINAPI ContextCallback_ContextCallback(IContextCallback
> *iface, PFNCONTEXTCALL pfnCallback, ComCallData* pParam, REFIID riid, int
> iMethod, IUnknown* pUnk)
> +{
> + FIXME("not implemented yet\n");
> + return E_NOTIMPL;
> +}
You should dump the parameters in the FIXME so that we have more of an
idea of what is going on. Something like "(%p, %p, %s, %d, %p):
stub\n" would be appropriate.
> +
> static const IComThreadingInfoVtbl Context_Threading_Vtbl =
> {
> Context_QueryInterface,
> @@ -3702,6 +3742,14 @@ static const IComThreadingInfoVtbl
> Context_Threading_Vtbl =
> Context_SetCurrentLogicalThreadId
> };
>
> +static const IContextCallbackVtbl Context_Callback_Vtbl =
> +{
> + ContextCallback_QueryInterface,
> + ContextCallback_AddRef,
> + ContextCallback_Release,
> + ContextCallback_ContextCallback
> +};
> +
> /***********************************************************************
> * CoGetObjectContext [OLE32.@]
> *
> @@ -3735,6 +3783,7 @@ HRESULT WINAPI CoGetObjectContext(REFIID riid, void
> **ppv)
> return E_OUTOFMEMORY;
>
> context->lpVtbl = &Context_Threading_Vtbl;
> +
> context->lpVtblIContextCallback=(IContextCallback*)&Context_Callback_Vtbl;
You can remove this typecast when the type of lpVtblContextCallback is fixed.
> context->refs = 1;
> if (apt->multi_threaded)
> context->apttype = APTTYPE_MTA;
--
Rob Shearman
More information about the wine-devel
mailing list