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?
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;
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;
+}
+
+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;
+}
+
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;
context->refs = 1;
if (apt->multi_threaded)
context->apttype = APTTYPE_MTA;