[PATCH 2/3] combase: Move CoGetContextToken().
Nikolay Sivov
nsivov at codeweavers.com
Thu Aug 20 02:34:41 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/combase/combase.c | 313 +++++++++++++++++++++++++++++++++++
dlls/combase/combase.spec | 2 +-
dlls/ole32/compobj.c | 336 --------------------------------------
dlls/ole32/ole32.spec | 2 +-
4 files changed, 315 insertions(+), 338 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index 516e8c9fd40..a2e5ac93a53 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -24,6 +24,7 @@
#define WIN32_NO_STATUS
#define USE_COM_CONTEXT_DEF
#include "objbase.h"
+#include "ctxtcall.h"
#include "oleauto.h"
#include "dde.h"
#include "winternl.h"
@@ -1898,3 +1899,315 @@ HRESULT WINAPI CoRegisterPSClsid(REFIID riid, REFCLSID rclsid)
return S_OK;
}
+
+struct thread_context
+{
+ IComThreadingInfo IComThreadingInfo_iface;
+ IContextCallback IContextCallback_iface;
+ IObjContext IObjContext_iface;
+ LONG refcount;
+};
+
+static inline struct thread_context *impl_from_IComThreadingInfo(IComThreadingInfo *iface)
+{
+ return CONTAINING_RECORD(iface, struct thread_context, IComThreadingInfo_iface);
+}
+
+static inline struct thread_context *impl_from_IContextCallback(IContextCallback *iface)
+{
+ return CONTAINING_RECORD(iface, struct thread_context, IContextCallback_iface);
+}
+
+static inline struct thread_context *impl_from_IObjContext(IObjContext *iface)
+{
+ return CONTAINING_RECORD(iface, struct thread_context, IObjContext_iface);
+}
+
+static HRESULT WINAPI thread_context_info_QueryInterface(IComThreadingInfo *iface, REFIID riid, void **obj)
+{
+ struct thread_context *context = impl_from_IComThreadingInfo(iface);
+
+ *obj = NULL;
+
+ if (IsEqualIID(riid, &IID_IComThreadingInfo) ||
+ IsEqualIID(riid, &IID_IUnknown))
+ {
+ *obj = &context->IComThreadingInfo_iface;
+ }
+ else if (IsEqualIID(riid, &IID_IContextCallback))
+ {
+ *obj = &context->IContextCallback_iface;
+ }
+ else if (IsEqualIID(riid, &IID_IObjContext))
+ {
+ *obj = &context->IObjContext_iface;
+ }
+
+ if (*obj)
+ {
+ IUnknown_AddRef((IUnknown *)*obj);
+ return S_OK;
+ }
+
+ FIXME("interface not implemented %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI thread_context_info_AddRef(IComThreadingInfo *iface)
+{
+ struct thread_context *context = impl_from_IComThreadingInfo(iface);
+ return InterlockedIncrement(&context->refcount);
+}
+
+static ULONG WINAPI thread_context_info_Release(IComThreadingInfo *iface)
+{
+ struct thread_context *context = impl_from_IComThreadingInfo(iface);
+
+ /* Context instance is initially created with CoGetContextToken() with refcount set to 0,
+ releasing context while refcount is at 0 destroys it. */
+ if (!context->refcount)
+ {
+ heap_free(context);
+ return 0;
+ }
+
+ return InterlockedDecrement(&context->refcount);
+}
+
+static HRESULT WINAPI thread_context_info_GetCurrentApartmentType(IComThreadingInfo *iface, APTTYPE *apttype)
+{
+ APTTYPEQUALIFIER qualifier;
+
+ TRACE("%p\n", apttype);
+
+ return CoGetApartmentType(apttype, &qualifier);
+}
+
+static HRESULT WINAPI thread_context_info_GetCurrentThreadType(IComThreadingInfo *iface, THDTYPE *thdtype)
+{
+ APTTYPEQUALIFIER qualifier;
+ APTTYPE apttype;
+ HRESULT hr;
+
+ hr = CoGetApartmentType(&apttype, &qualifier);
+ if (FAILED(hr))
+ return hr;
+
+ TRACE("%p\n", thdtype);
+
+ switch (apttype)
+ {
+ case APTTYPE_STA:
+ case APTTYPE_MAINSTA:
+ *thdtype = THDTYPE_PROCESSMESSAGES;
+ break;
+ default:
+ *thdtype = THDTYPE_BLOCKMESSAGES;
+ break;
+ }
+ return S_OK;
+}
+
+static HRESULT WINAPI thread_context_info_GetCurrentLogicalThreadId(IComThreadingInfo *iface, GUID *logical_thread_id)
+{
+ TRACE("%p\n", logical_thread_id);
+
+ return CoGetCurrentLogicalThreadId(logical_thread_id);
+}
+
+static HRESULT WINAPI thread_context_info_SetCurrentLogicalThreadId(IComThreadingInfo *iface, REFGUID logical_thread_id)
+{
+ FIXME("%s stub\n", debugstr_guid(logical_thread_id));
+
+ return E_NOTIMPL;
+}
+
+static const IComThreadingInfoVtbl thread_context_info_vtbl =
+{
+ thread_context_info_QueryInterface,
+ thread_context_info_AddRef,
+ thread_context_info_Release,
+ thread_context_info_GetCurrentApartmentType,
+ thread_context_info_GetCurrentThreadType,
+ thread_context_info_GetCurrentLogicalThreadId,
+ thread_context_info_SetCurrentLogicalThreadId
+};
+
+static HRESULT WINAPI thread_context_callback_QueryInterface(IContextCallback *iface, REFIID riid, void **obj)
+{
+ struct thread_context *context = impl_from_IContextCallback(iface);
+ return IComThreadingInfo_QueryInterface(&context->IComThreadingInfo_iface, riid, obj);
+}
+
+static ULONG WINAPI thread_context_callback_AddRef(IContextCallback *iface)
+{
+ struct thread_context *context = impl_from_IContextCallback(iface);
+ return IComThreadingInfo_AddRef(&context->IComThreadingInfo_iface);
+}
+
+static ULONG WINAPI thread_context_callback_Release(IContextCallback *iface)
+{
+ struct thread_context *context = impl_from_IContextCallback(iface);
+ return IComThreadingInfo_Release(&context->IComThreadingInfo_iface);
+}
+
+static HRESULT WINAPI thread_context_callback_ContextCallback(IContextCallback *iface,
+ PFNCONTEXTCALL callback, ComCallData *param, REFIID riid, int method, IUnknown *punk)
+{
+ FIXME("%p, %p, %p, %s, %d, %p\n", iface, callback, param, debugstr_guid(riid), method, punk);
+
+ return E_NOTIMPL;
+}
+
+static const IContextCallbackVtbl thread_context_callback_vtbl =
+{
+ thread_context_callback_QueryInterface,
+ thread_context_callback_AddRef,
+ thread_context_callback_Release,
+ thread_context_callback_ContextCallback
+};
+
+static HRESULT WINAPI thread_object_context_QueryInterface(IObjContext *iface, REFIID riid, void **obj)
+{
+ struct thread_context *context = impl_from_IObjContext(iface);
+ return IComThreadingInfo_QueryInterface(&context->IComThreadingInfo_iface, riid, obj);
+}
+
+static ULONG WINAPI thread_object_context_AddRef(IObjContext *iface)
+{
+ struct thread_context *context = impl_from_IObjContext(iface);
+ return IComThreadingInfo_AddRef(&context->IComThreadingInfo_iface);
+}
+
+static ULONG WINAPI thread_object_context_Release(IObjContext *iface)
+{
+ struct thread_context *context = impl_from_IObjContext(iface);
+ return IComThreadingInfo_Release(&context->IComThreadingInfo_iface);
+}
+
+static HRESULT WINAPI thread_object_context_SetProperty(IObjContext *iface, REFGUID propid, CPFLAGS flags, IUnknown *punk)
+{
+ FIXME("%p, %s, %x, %p\n", iface, debugstr_guid(propid), flags, punk);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI thread_object_context_RemoveProperty(IObjContext *iface, REFGUID propid)
+{
+ FIXME("%p, %s\n", iface, debugstr_guid(propid));
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI thread_object_context_GetProperty(IObjContext *iface, REFGUID propid, CPFLAGS *flags, IUnknown **punk)
+{
+ FIXME("%p, %s, %p, %p\n", iface, debugstr_guid(propid), flags, punk);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI thread_object_context_EnumContextProps(IObjContext *iface, IEnumContextProps **props)
+{
+ FIXME("%p, %p\n", iface, props);
+
+ return E_NOTIMPL;
+}
+
+static void WINAPI thread_object_context_Reserved1(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved2(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved3(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved4(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved5(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved6(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static void WINAPI thread_object_context_Reserved7(IObjContext *iface)
+{
+ FIXME("%p\n", iface);
+}
+
+static const IObjContextVtbl thread_object_context_vtbl =
+{
+ thread_object_context_QueryInterface,
+ thread_object_context_AddRef,
+ thread_object_context_Release,
+ thread_object_context_SetProperty,
+ thread_object_context_RemoveProperty,
+ thread_object_context_GetProperty,
+ thread_object_context_EnumContextProps,
+ thread_object_context_Reserved1,
+ thread_object_context_Reserved2,
+ thread_object_context_Reserved3,
+ thread_object_context_Reserved4,
+ thread_object_context_Reserved5,
+ thread_object_context_Reserved6,
+ thread_object_context_Reserved7
+};
+
+/***********************************************************************
+ * CoGetContextToken (combase.@)
+ */
+HRESULT WINAPI CoGetContextToken(ULONG_PTR *token)
+{
+ struct tlsdata *tlsdata;
+ HRESULT hr;
+
+ TRACE("%p\n", token);
+
+ if (!InternalIsInitialized())
+ {
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
+ }
+
+ if (FAILED(hr = com_get_tlsdata(&tlsdata)))
+ return hr;
+
+ if (!token)
+ return E_POINTER;
+
+ if (!tlsdata->context_token)
+ {
+ struct thread_context *context;
+
+ context = heap_alloc_zero(sizeof(*context));
+ if (!context)
+ return E_OUTOFMEMORY;
+
+ context->IComThreadingInfo_iface.lpVtbl = &thread_context_info_vtbl;
+ context->IContextCallback_iface.lpVtbl = &thread_context_callback_vtbl;
+ context->IObjContext_iface.lpVtbl = &thread_object_context_vtbl;
+ /* Context token does not take a reference, it's always zero until the
+ interface is explicitly requested with CoGetObjectContext(). */
+ context->refcount = 0;
+
+ tlsdata->context_token = &context->IObjContext_iface;
+ }
+
+ *token = (ULONG_PTR)tlsdata->context_token;
+ TRACE("context_token %p\n", tlsdata->context_token);
+
+ return S_OK;
+}
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 02004852aa8..806ee015371 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -103,7 +103,7 @@
@ stub CoGetCancelObject
@ stdcall CoGetClassObject(ptr long ptr ptr ptr) ole32.CoGetClassObject
@ stub CoGetClassVersion
-@ stdcall CoGetContextToken(ptr) ole32.CoGetContextToken
+@ stdcall CoGetContextToken(ptr)
@ stdcall CoGetCurrentLogicalThreadId(ptr) ole32.CoGetCurrentLogicalThreadId
@ stdcall CoGetCurrentProcess() ole32.CoGetCurrentProcess
@ stdcall CoGetDefaultContext(long ptr ptr)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index e8cc75c7de4..83644782589 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3142,342 +3142,6 @@ HRESULT WINAPI CoRegisterChannelHook(REFGUID guidExtension, IChannelHook *pChann
return RPC_RegisterChannelHook(guidExtension, pChannelHook);
}
-typedef struct Context
-{
- IComThreadingInfo IComThreadingInfo_iface;
- IContextCallback IContextCallback_iface;
- IObjContext IObjContext_iface;
- LONG refs;
-} Context;
-
-static inline Context *impl_from_IComThreadingInfo( IComThreadingInfo *iface )
-{
- return CONTAINING_RECORD(iface, Context, IComThreadingInfo_iface);
-}
-
-static inline Context *impl_from_IContextCallback( IContextCallback *iface )
-{
- return CONTAINING_RECORD(iface, Context, IContextCallback_iface);
-}
-
-static inline Context *impl_from_IObjContext( IObjContext *iface )
-{
- return CONTAINING_RECORD(iface, Context, IObjContext_iface);
-}
-
-static HRESULT Context_QueryInterface(Context *iface, REFIID riid, LPVOID *ppv)
-{
- *ppv = NULL;
-
- if (IsEqualIID(riid, &IID_IComThreadingInfo) ||
- IsEqualIID(riid, &IID_IUnknown))
- {
- *ppv = &iface->IComThreadingInfo_iface;
- }
- else if (IsEqualIID(riid, &IID_IContextCallback))
- {
- *ppv = &iface->IContextCallback_iface;
- }
- else if (IsEqualIID(riid, &IID_IObjContext))
- {
- *ppv = &iface->IObjContext_iface;
- }
-
- if (*ppv)
- {
- IUnknown_AddRef((IUnknown*)*ppv);
- return S_OK;
- }
-
- FIXME("interface not implemented %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-static ULONG Context_AddRef(Context *This)
-{
- return InterlockedIncrement(&This->refs);
-}
-
-static ULONG Context_Release(Context *This)
-{
- /* Context instance is initially created with CoGetContextToken() with refcount set to 0,
- releasing context while refcount is at 0 destroys it. */
- if (!This->refs)
- {
- HeapFree(GetProcessHeap(), 0, This);
- return 0;
- }
-
- return InterlockedDecrement(&This->refs);
-}
-
-static HRESULT WINAPI Context_CTI_QueryInterface(IComThreadingInfo *iface, REFIID riid, LPVOID *ppv)
-{
- Context *This = impl_from_IComThreadingInfo(iface);
- return Context_QueryInterface(This, riid, ppv);
-}
-
-static ULONG WINAPI Context_CTI_AddRef(IComThreadingInfo *iface)
-{
- Context *This = impl_from_IComThreadingInfo(iface);
- return Context_AddRef(This);
-}
-
-static ULONG WINAPI Context_CTI_Release(IComThreadingInfo *iface)
-{
- Context *This = impl_from_IComThreadingInfo(iface);
- return Context_Release(This);
-}
-
-static HRESULT WINAPI Context_CTI_GetCurrentApartmentType(IComThreadingInfo *iface, APTTYPE *apttype)
-{
- APTTYPEQUALIFIER qualifier;
-
- TRACE("(%p)\n", apttype);
-
- return CoGetApartmentType(apttype, &qualifier);
-}
-
-static HRESULT WINAPI Context_CTI_GetCurrentThreadType(IComThreadingInfo *iface, THDTYPE *thdtype)
-{
- APTTYPEQUALIFIER qualifier;
- APTTYPE apttype;
- HRESULT hr;
-
- hr = CoGetApartmentType(&apttype, &qualifier);
- if (FAILED(hr))
- return hr;
-
- TRACE("(%p)\n", thdtype);
-
- switch (apttype)
- {
- case APTTYPE_STA:
- case APTTYPE_MAINSTA:
- *thdtype = THDTYPE_PROCESSMESSAGES;
- break;
- default:
- *thdtype = THDTYPE_BLOCKMESSAGES;
- break;
- }
- return S_OK;
-}
-
-static HRESULT WINAPI Context_CTI_GetCurrentLogicalThreadId(IComThreadingInfo *iface, GUID *logical_thread_id)
-{
- TRACE("(%p)\n", logical_thread_id);
- return CoGetCurrentLogicalThreadId(logical_thread_id);
-}
-
-static HRESULT WINAPI Context_CTI_SetCurrentLogicalThreadId(IComThreadingInfo *iface, REFGUID logical_thread_id)
-{
- FIXME("(%s): stub\n", debugstr_guid(logical_thread_id));
- return E_NOTIMPL;
-}
-
-static const IComThreadingInfoVtbl Context_Threading_Vtbl =
-{
- Context_CTI_QueryInterface,
- Context_CTI_AddRef,
- Context_CTI_Release,
- Context_CTI_GetCurrentApartmentType,
- Context_CTI_GetCurrentThreadType,
- Context_CTI_GetCurrentLogicalThreadId,
- Context_CTI_SetCurrentLogicalThreadId
-};
-
-static HRESULT WINAPI Context_CC_QueryInterface(IContextCallback *iface, REFIID riid, LPVOID *ppv)
-{
- Context *This = impl_from_IContextCallback(iface);
- return Context_QueryInterface(This, riid, ppv);
-}
-
-static ULONG WINAPI Context_CC_AddRef(IContextCallback *iface)
-{
- Context *This = impl_from_IContextCallback(iface);
- return Context_AddRef(This);
-}
-
-static ULONG WINAPI Context_CC_Release(IContextCallback *iface)
-{
- Context *This = impl_from_IContextCallback(iface);
- return Context_Release(This);
-}
-
-static HRESULT WINAPI Context_CC_ContextCallback(IContextCallback *iface, PFNCONTEXTCALL pCallback,
- ComCallData *param, REFIID riid, int method, IUnknown *punk)
-{
- Context *This = impl_from_IContextCallback(iface);
-
- FIXME("(%p/%p)->(%p, %p, %s, %d, %p)\n", This, iface, pCallback, param, debugstr_guid(riid), method, punk);
- return E_NOTIMPL;
-}
-
-static const IContextCallbackVtbl Context_Callback_Vtbl =
-{
- Context_CC_QueryInterface,
- Context_CC_AddRef,
- Context_CC_Release,
- Context_CC_ContextCallback
-};
-
-static HRESULT WINAPI Context_OC_QueryInterface(IObjContext *iface, REFIID riid, LPVOID *ppv)
-{
- Context *This = impl_from_IObjContext(iface);
- return Context_QueryInterface(This, riid, ppv);
-}
-
-static ULONG WINAPI Context_OC_AddRef(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- return Context_AddRef(This);
-}
-
-static ULONG WINAPI Context_OC_Release(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- return Context_Release(This);
-}
-
-static HRESULT WINAPI Context_OC_SetProperty(IObjContext *iface, REFGUID propid, CPFLAGS flags, IUnknown *punk)
-{
- Context *This = impl_from_IObjContext(iface);
-
- FIXME("(%p/%p)->(%s, %x, %p)\n", This, iface, debugstr_guid(propid), flags, punk);
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI Context_OC_RemoveProperty(IObjContext *iface, REFGUID propid)
-{
- Context *This = impl_from_IObjContext(iface);
-
- FIXME("(%p/%p)->(%s)\n", This, iface, debugstr_guid(propid));
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI Context_OC_GetProperty(IObjContext *iface, REFGUID propid, CPFLAGS *flags, IUnknown **punk)
-{
- Context *This = impl_from_IObjContext(iface);
-
- FIXME("(%p/%p)->(%s, %p, %p)\n", This, iface, debugstr_guid(propid), flags, punk);
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI Context_OC_EnumContextProps(IObjContext *iface, IEnumContextProps **props)
-{
- Context *This = impl_from_IObjContext(iface);
-
- FIXME("(%p/%p)->(%p)\n", This, iface, props);
- return E_NOTIMPL;
-}
-
-static void WINAPI Context_OC_Reserved1(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved2(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved3(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved4(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved5(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved6(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static void WINAPI Context_OC_Reserved7(IObjContext *iface)
-{
- Context *This = impl_from_IObjContext(iface);
- FIXME("(%p/%p)\n", This, iface);
-}
-
-static const IObjContextVtbl Context_Object_Vtbl =
-{
- Context_OC_QueryInterface,
- Context_OC_AddRef,
- Context_OC_Release,
- Context_OC_SetProperty,
- Context_OC_RemoveProperty,
- Context_OC_GetProperty,
- Context_OC_EnumContextProps,
- Context_OC_Reserved1,
- Context_OC_Reserved2,
- Context_OC_Reserved3,
- Context_OC_Reserved4,
- Context_OC_Reserved5,
- Context_OC_Reserved6,
- Context_OC_Reserved7
-};
-
-/***********************************************************************
- * CoGetContextToken [OLE32.@]
- */
-HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
-{
- struct oletls *info = COM_CurrentInfo();
- APARTMENT *apt;
-
- TRACE("(%p)\n", token);
-
- if (!info)
- return E_OUTOFMEMORY;
-
- if (!(apt = apartment_get_current_or_mta()))
- {
- ERR("apartment not initialised\n");
- return CO_E_NOTINITIALIZED;
- }
- apartment_release(apt);
-
- if (!token)
- return E_POINTER;
-
- if (!info->context_token)
- {
- Context *context;
-
- context = HeapAlloc(GetProcessHeap(), 0, sizeof(*context));
- if (!context)
- return E_OUTOFMEMORY;
-
- context->IComThreadingInfo_iface.lpVtbl = &Context_Threading_Vtbl;
- context->IContextCallback_iface.lpVtbl = &Context_Callback_Vtbl;
- context->IObjContext_iface.lpVtbl = &Context_Object_Vtbl;
- /* Context token does not take a reference, it's always zero until the
- interface is explicitly requested with CoGetObjectContext(). */
- context->refs = 0;
-
- info->context_token = &context->IObjContext_iface;
- }
-
- *token = (ULONG_PTR)info->context_token;
- TRACE("context_token=%p\n", info->context_token);
-
- return S_OK;
-}
-
HRESULT Handler_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
static const WCHAR wszInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 02a8434d264..9c663692484 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -31,7 +31,7 @@
@ stdcall CoGetCallState(long ptr) combase.CoGetCallState
@ stdcall CoGetCallerTID(ptr)
@ stdcall CoGetClassObject(ptr long ptr ptr ptr)
-@ stdcall CoGetContextToken(ptr)
+@ stdcall CoGetContextToken(ptr) combase.CoGetContextToken
@ stdcall CoGetCurrentLogicalThreadId(ptr)
@ stdcall CoGetCurrentProcess()
@ stdcall CoGetDefaultContext(long ptr ptr) combase.CoGetDefaultContext
--
2.28.0
More information about the wine-devel
mailing list