[PATCH 4/5] combase: Move core apartment and activation functionality.
Nikolay Sivov
nsivov at codeweavers.com
Tue Aug 25 10:18:16 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/combase/Makefile.in | 1 +
dlls/{ole32 => combase}/apartment.c | 94 +++++++++++++++++------------
dlls/combase/combase.c | 19 ++++++
dlls/combase/combase.spec | 16 +++++
dlls/combase/combase_private.h | 42 +++++++++++++
dlls/ole32/Makefile.in | 1 -
dlls/ole32/compobj.c | 10 ++-
dlls/ole32/compobj_private.h | 31 +++++-----
dlls/ole32/marshal.c | 2 +-
dlls/ole32/ole32.spec | 5 ++
dlls/ole32/rpc.c | 4 +-
dlls/ole32/stubmanager.c | 5 ++
12 files changed, 165 insertions(+), 65 deletions(-)
rename dlls/{ole32 => combase}/apartment.c (92%)
diff --git a/dlls/combase/Makefile.in b/dlls/combase/Makefile.in
index 16a2bfa3167..45e1ff189cb 100644
--- a/dlls/combase/Makefile.in
+++ b/dlls/combase/Makefile.in
@@ -6,6 +6,7 @@ DELAYIMPORTS = oleaut32
EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
+ apartment.c \
combase.c \
errorinfo.c \
malloc.c \
diff --git a/dlls/ole32/apartment.c b/dlls/combase/apartment.c
similarity index 92%
rename from dlls/ole32/apartment.c
rename to dlls/combase/apartment.c
index 456e6c80a36..dbf4553fa41 100644
--- a/dlls/ole32/apartment.c
+++ b/dlls/combase/apartment.c
@@ -33,7 +33,7 @@
#include "winbase.h"
#include "servprov.h"
-#include "compobj_private.h"
+#include "combase_private.h"
#include "wine/debug.h"
#include "wine/list.h"
@@ -306,10 +306,13 @@ static ULONG WINAPI local_server_Release(IServiceProvider *iface)
return refcount;
}
+extern HRESULT WINAPI InternalGetRegisteredClassObject(struct apartment *apt, REFGUID guid,
+ DWORD clscontext, IUnknown **obj);
+
static HRESULT WINAPI local_server_QueryService(IServiceProvider *iface, REFGUID guid, REFIID riid, void **obj)
{
struct local_server *local_server = impl_from_IServiceProvider(iface);
- struct apartment *apt = COM_CurrentApt();
+ struct apartment *apt = com_get_current_apt();
HRESULT hr = E_FAIL;
IUnknown *unk;
@@ -318,7 +321,7 @@ static HRESULT WINAPI local_server_QueryService(IServiceProvider *iface, REFGUID
if (!local_server->apt)
return E_UNEXPECTED;
- if (SUCCEEDED(COM_GetRegisteredClassObject(apt, guid, CLSCTX_LOCAL_SERVER, &unk)))
+ if (SUCCEEDED(InternalGetRegisteredClassObject(apt, guid, CLSCTX_LOCAL_SERVER, &unk)))
{
hr = IUnknown_QueryInterface(unk, riid, obj);
IUnknown_Release(unk);
@@ -335,7 +338,7 @@ static const IServiceProviderVtbl local_server_vtbl =
local_server_QueryService
};
-HRESULT apartment_get_local_server_stream(struct apartment *apt, IStream **ret)
+HRESULT WINAPI apartment_get_local_server_stream(struct apartment *apt, IStream **ret)
{
HRESULT hr = S_OK;
@@ -400,7 +403,7 @@ static struct apartment *apartment_construct(DWORD model)
apt->remunk_exported = FALSE;
apt->oidc = 1;
InitializeCriticalSection(&apt->cs);
- DEBUG_SET_CRITSEC_NAME(&apt->cs, "apartment");
+ apt->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": apartment");
apt->multi_threaded = !(model & COINIT_APARTMENTTHREADED);
@@ -423,7 +426,7 @@ static struct apartment *apartment_construct(DWORD model)
}
/* Frees unused libraries loaded into apartment */
-void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
+void WINAPI apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
{
struct apartment_loaded_dll *entry, *next;
@@ -464,7 +467,11 @@ void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
LeaveCriticalSection(&apt->cs);
}
-void apartment_release(struct apartment *apt)
+extern void WINAPI InternalRevokeAllClasses(struct apartment *apt);
+extern HRESULT WINAPI Internal_apartment_disconnectproxies(struct apartment *apt);
+extern ULONG WINAPI Internal_stub_manager_int_release(struct stub_manager *stubmgr);
+
+void WINAPI apartment_release(struct apartment *apt)
{
DWORD refcount;
@@ -513,12 +520,12 @@ void apartment_release(struct apartment *apt)
}
/* Release the references to the registered class objects */
- COM_RevokeAllClasses(apt);
+ InternalRevokeAllClasses(apt);
/* no locking is needed for this apartment, because no other thread
* can access it at this point */
- apartment_disconnectproxies(apt);
+ Internal_apartment_disconnectproxies(apt);
if (apt->win) DestroyWindow(apt->win);
if (apt->host_apt_tid) PostThreadMessageW(apt->host_apt_tid, WM_QUIT, 0, 0);
@@ -531,7 +538,7 @@ void apartment_release(struct apartment *apt)
* stub manager list in the apartment and all non-apartment users
* must have a ref on the apartment and so it cannot be destroyed).
*/
- stub_manager_int_release(stubmgr);
+ Internal_stub_manager_int_release(stubmgr);
}
/* if this assert fires, then another thread took a reference to a
@@ -555,7 +562,7 @@ void apartment_release(struct apartment *apt)
heap_free(apartment_loaded_dll);
}
- DEBUG_CLEAR_CRITSEC_NAME(&apt->cs);
+ apt->cs.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&apt->cs);
heap_free(apt);
@@ -572,7 +579,8 @@ static DWORD apartment_addref(struct apartment *apt)
/* Gets existing apartment or creates a new one and enters it */
static struct apartment *apartment_get_or_create(DWORD model)
{
- struct apartment *apt = COM_CurrentApt();
+ struct apartment *apt = com_get_current_apt();
+ struct tlsdata *data;
if (!apt)
{
@@ -612,13 +620,14 @@ static struct apartment *apartment_get_or_create(DWORD model)
LeaveCriticalSection(&apt_cs);
}
- COM_CurrentInfo()->apt = apt;
+ com_get_tlsdata(&data);
+ data->apt = apt;
}
return apt;
}
-struct apartment *apartment_get_mta(void)
+struct apartment * WINAPI apartment_get_mta(void)
{
struct apartment *apt;
@@ -634,9 +643,9 @@ struct apartment *apartment_get_mta(void)
/* Return the current apartment if it exists, or, failing that, the MTA. Caller
* must free the returned apartment in either case. */
-struct apartment *apartment_get_current_or_mta(void)
+struct apartment * WINAPI apartment_get_current_or_mta(void)
{
- struct apartment *apt = COM_CurrentApt();
+ struct apartment *apt = com_get_current_apt();
if (apt)
{
apartment_addref(apt);
@@ -646,7 +655,7 @@ struct apartment *apartment_get_current_or_mta(void)
}
/* The given OXID must be local to this process */
-struct apartment *apartment_findfromoxid(OXID oxid)
+struct apartment * WINAPI apartment_findfromoxid(OXID oxid)
{
struct apartment *result = NULL;
struct list *cursor;
@@ -670,7 +679,7 @@ struct apartment *apartment_findfromoxid(OXID oxid)
/* gets the apartment which has a given creator thread ID. The caller must
* release the reference from the apartment as soon as the apartment pointer
* is no longer required. */
-struct apartment *apartment_findfromtid(DWORD tid)
+struct apartment * WINAPI apartment_findfromtid(DWORD tid)
{
struct apartment *result = NULL;
struct list *cursor;
@@ -778,10 +787,14 @@ static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
if (!wcsicmp(dllpath, L"ole32.dll"))
{
+ HRESULT (WINAPI *p_ole32_DllGetClassObject)(REFCLSID clsid, REFIID riid, void **obj);
+
+ p_ole32_DllGetClassObject = (void *)GetProcAddress(GetModuleHandleW(L"ole32.dll"), "DllGetClassObject");
+
/* we don't need to control the lifetime of this dll, so use the local
* implementation of DllGetClassObject directly */
TRACE("calling ole32!DllGetClassObject\n");
- hr = DllGetClassObject(rclsid, riid, ppv);
+ hr = p_ole32_DllGetClassObject(rclsid, riid, ppv);
if (hr != S_OK)
ERR("DllGetClassObject returned error 0x%08x for dll %s\n", hr, debugstr_w(dllpath));
@@ -863,7 +876,7 @@ static DWORD CALLBACK apartment_hostobject_thread(void *p)
hr = CoInitializeEx(NULL, params->threading_model);
if (FAILED(hr)) return hr;
- apt = COM_CurrentApt();
+ apt = com_get_current_apt();
if (params->threading_model == COINIT_APARTMENTTHREADED)
{
apartment_createwindowifneeded(apt);
@@ -1035,7 +1048,7 @@ static enum comclass_threadingmodel get_threading_model(const struct class_reg_d
return data->u.actctx.threading_model;
}
-HRESULT apartment_get_inproc_class_object(struct apartment *apt, const struct class_reg_data *regdata,
+HRESULT WINAPI apartment_get_inproc_class_object(struct apartment *apt, const struct class_reg_data *regdata,
REFCLSID rclsid, REFIID riid, BOOL hostifnecessary, void **ppv)
{
WCHAR dllpath[MAX_PATH+1];
@@ -1112,15 +1125,18 @@ static HRESULT apartment_hostobject(struct apartment *apt, const struct host_obj
return hr;
}
+struct dispatch_params;
+extern void WINAPI Internal_RPC_ExecuteCall(struct dispatch_params *params);
+
static LRESULT CALLBACK apartment_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case DM_EXECUTERPC:
- RPC_ExecuteCall((struct dispatch_params *)lParam);
+ Internal_RPC_ExecuteCall((struct dispatch_params *)lParam);
return 0;
case DM_HOSTOBJECT:
- return apartment_hostobject(COM_CurrentApt(), (const struct host_object_params *)lParam);
+ return apartment_hostobject(com_get_current_apt(), (const struct host_object_params *)lParam);
default:
return DefWindowProcW(hWnd, msg, wParam, lParam);
}
@@ -1131,38 +1147,38 @@ static BOOL apartment_is_model(const struct apartment *apt, DWORD model)
return (apt->multi_threaded == !(model & COINIT_APARTMENTTHREADED));
}
-HRESULT enter_apartment(struct oletls *info, DWORD model)
+HRESULT WINAPI enter_apartment(struct tlsdata *data, DWORD model)
{
HRESULT hr = S_OK;
- if (!info->apt)
+ if (!data->apt)
{
if (!apartment_get_or_create(model))
return E_OUTOFMEMORY;
}
- else if (!apartment_is_model(info->apt, model))
+ else if (!apartment_is_model(data->apt, model))
{
- WARN( "Attempt to change threading model of this apartment from %s to %s\n",
- info->apt->multi_threaded ? "multi-threaded" : "apartment threaded",
+ WARN("Attempt to change threading model of this apartment from %s to %s\n",
+ data->apt->multi_threaded ? "multi-threaded" : "apartment threaded",
model & COINIT_APARTMENTTHREADED ? "apartment threaded" : "multi-threaded" );
return RPC_E_CHANGED_MODE;
}
else
hr = S_FALSE;
- info->inits++;
+ data->inits++;
return hr;
}
-void leave_apartment(struct oletls *info)
+void WINAPI leave_apartment(struct tlsdata *data)
{
- if (!--info->inits)
+ if (!--data->inits)
{
- if (info->ole_inits)
+ if (data->ole_inits)
WARN( "Uninitializing apartment while Ole is still initialized\n" );
- apartment_release(info->apt);
- info->apt = NULL;
+ apartment_release(data->apt);
+ data->apt = NULL;
}
}
@@ -1171,7 +1187,7 @@ struct mta_cookie
struct list entry;
};
-HRESULT apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie)
+HRESULT WINAPI apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie)
{
struct mta_cookie *mta_cookie;
@@ -1195,7 +1211,7 @@ HRESULT apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie)
return S_OK;
}
-void apartment_decrement_mta_usage(CO_MTA_USAGE_COOKIE cookie)
+void WINAPI apartment_decrement_mta_usage(CO_MTA_USAGE_COOKIE cookie)
{
struct mta_cookie *mta_cookie = (struct mta_cookie *)cookie;
@@ -1246,7 +1262,7 @@ static BOOL WINAPI register_class( INIT_ONCE *once, void *param, void **context
/* create a window for the apartment or return the current one if one has
* already been created */
-HRESULT apartment_createwindowifneeded(struct apartment *apt)
+HRESULT WINAPI apartment_createwindowifneeded(struct apartment *apt)
{
static INIT_ONCE class_init_once = INIT_ONCE_STATIC_INIT;
@@ -1274,13 +1290,13 @@ HRESULT apartment_createwindowifneeded(struct apartment *apt)
}
/* retrieves the window for the main- or apartment-threaded apartment */
-HWND apartment_getwindow(const struct apartment *apt)
+HWND WINAPI apartment_getwindow(const struct apartment *apt)
{
assert(!apt->multi_threaded);
return apt->win;
}
-void apartment_global_cleanup(void)
+void WINAPI apartment_global_cleanup(void)
{
if (apt_win_class)
UnregisterClassW((const WCHAR *)MAKEINTATOM(apt_win_class), hProxyDll);
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index 80d6ece266e..286b7be8b86 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -36,6 +36,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
+HINSTANCE hProxyDll;
+
#define CHARS_IN_GUID 39
struct comclassredirect_data
@@ -2249,3 +2251,20 @@ DWORD WINAPI CoGetCurrentProcess(void)
return tlsdata->thread_seqid;
}
+
+/***********************************************************************
+ * DllMain (combase.@)
+ */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved)
+{
+ TRACE("%p 0x%x %p\n", hinstDLL, reason, reserved);
+
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ hProxyDll = hinstDLL;
+ break;
+ }
+
+ return TRUE;
+}
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 9038d5fa8bf..980ffa820cd 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -351,3 +351,19 @@
@ stdcall WindowsSubstringWithSpecifiedLength(ptr long long ptr)
@ stdcall WindowsTrimStringEnd(ptr ptr ptr)
@ stdcall WindowsTrimStringStart(ptr ptr ptr)
+
+@ stdcall apartment_get_current_or_mta()
+@ stdcall apartment_release(ptr)
+@ stdcall enter_apartment(ptr long)
+@ stdcall leave_apartment(ptr)
+@ stdcall apartment_get_inproc_class_object(ptr ptr ptr ptr long ptr)
+@ stdcall apartment_freeunusedlibraries(ptr long)
+@ stdcall apartment_get_mta()
+@ stdcall apartment_decrement_mta_usage(ptr)
+@ stdcall apartment_increment_mta_usage(ptr)
+@ stdcall apartment_findfromoxid(int64)
+@ stdcall apartment_getwindow(ptr)
+@ stdcall apartment_global_cleanup()
+@ stdcall apartment_createwindowifneeded(ptr)
+@ stdcall apartment_get_local_server_stream(ptr ptr)
+@ stdcall apartment_findfromtid(long)
diff --git a/dlls/combase/combase_private.h b/dlls/combase/combase_private.h
index 7d7583282e1..16d926d13b4 100644
--- a/dlls/combase/combase_private.h
+++ b/dlls/combase/combase_private.h
@@ -17,8 +17,11 @@
#include "winternl.h"
#include "wine/orpc.h"
+#include "wine/heap.h"
#include "wine/list.h"
+extern HINSTANCE hProxyDll;
+
struct apartment
{
struct list entry;
@@ -51,6 +54,10 @@ struct apartment
struct list usage_cookies; /* Used for refcount control with CoIncrementMTAUsage()/CoDecrementMTAUsage(). */
};
+/* DCOM messages used by the apartment window (not compatible with native) */
+#define DM_EXECUTERPC (WM_USER + 0) /* WPARAM = 0, LPARAM = (struct dispatch_params *) */
+#define DM_HOSTOBJECT (WM_USER + 1) /* WPARAM = 0, LPARAM = (struct host_object_params *) */
+
/* this is what is stored in TEB->ReservedForOle */
struct tlsdata
{
@@ -89,5 +96,40 @@ static inline struct apartment* com_get_current_apt(void)
return tlsdata->apt;
}
+HWND WINAPI apartment_getwindow(const struct apartment *apt) DECLSPEC_HIDDEN;
+HRESULT WINAPI apartment_createwindowifneeded(struct apartment *apt) DECLSPEC_HIDDEN;
+
/* RpcSs interface */
HRESULT rpcss_get_next_seqid(DWORD *id) DECLSPEC_HIDDEN;
+
+/* stub managers hold refs on the object and each interface stub */
+struct stub_manager
+{
+ struct list entry; /* entry in apartment stubmgr list (CS apt->cs) */
+ struct list ifstubs; /* list of active ifstubs for the object (CS lock) */
+ CRITICAL_SECTION lock;
+ struct apartment *apt; /* owning apt (RO) */
+
+ ULONG extrefs; /* number of 'external' references (CS lock) */
+ ULONG refs; /* internal reference count (CS apt->cs) */
+ ULONG weakrefs; /* number of weak references (CS lock) */
+ OID oid; /* apartment-scoped unique identifier (RO) */
+ IUnknown *object; /* the object we are managing the stub for (RO) */
+ ULONG next_ipid; /* currently unused (LOCK) */
+ OXID_INFO oxid_info; /* string binding, ipid of rem unknown and other information (RO) */
+
+ IExternalConnection *extern_conn;
+
+ /* We need to keep a count of the outstanding marshals, so we can enforce the
+ * marshalling rules (ie, you can only unmarshal normal marshals once). Note
+ * that these counts do NOT include unmarshalled interfaces, once a stream is
+ * unmarshalled and a proxy set up, this count is decremented.
+ */
+
+ ULONG norm_refs; /* refcount of normal marshals (CS lock) */
+ BOOL disconnected; /* CoDisconnectObject has been called (CS lock) */
+};
+
+/* Stub Manager */
+
+ULONG stub_manager_int_release(struct stub_manager *This) DECLSPEC_HIDDEN;
diff --git a/dlls/ole32/Makefile.in b/dlls/ole32/Makefile.in
index 5a2b21dee4f..1c1e28fa4c5 100644
--- a/dlls/ole32/Makefile.in
+++ b/dlls/ole32/Makefile.in
@@ -8,7 +8,6 @@ EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
antimoniker.c \
- apartment.c \
bindctx.c \
classmoniker.c \
clipboard.c \
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index d59da4207a7..8451953baaf 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -393,7 +393,7 @@ static void COM_RevokeRegisteredClassObject(RegisteredClass *curClass)
HeapFree(GetProcessHeap(), 0, curClass);
}
-void COM_RevokeAllClasses(const struct apartment *apt)
+void WINAPI InternalRevokeAllClasses(const struct apartment *apt)
{
RegisteredClass *curClass, *cursor;
@@ -997,8 +997,6 @@ HRESULT COM_OpenKeyForAppIdFromCLSID(REFCLSID clsid, REGSAM access, HKEY *subkey
}
/***
- * COM_GetRegisteredClassObject
- *
* This internal method is used to scan the registered class list to
* find a class object.
*
@@ -1009,7 +1007,7 @@ HRESULT COM_OpenKeyForAppIdFromCLSID(REFCLSID clsid, REGSAM access, HKEY *subkey
* to normal COM usage, this method will increase the
* reference count on this object.
*/
-HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
+HRESULT WINAPI InternalGetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
DWORD dwClsContext, LPUNKNOWN* ppUnk)
{
HRESULT hr = S_FALSE;
@@ -1110,7 +1108,7 @@ HRESULT WINAPI CoRegisterClassObject(
* First, check if the class is already registered.
* If it is, this should cause an error.
*/
- hr = COM_GetRegisteredClassObject(apt, rclsid, dwClsContext, &foundObject);
+ hr = InternalGetRegisteredClassObject(apt, rclsid, dwClsContext, &foundObject);
if (hr == S_OK) {
if (flags & REGCLS_MULTIPLEUSE) {
if (dwClsContext & CLSCTX_LOCAL_SERVER)
@@ -1267,7 +1265,7 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(
* First, try and see if we can't match the class ID with one of the
* registered classes.
*/
- if (S_OK == COM_GetRegisteredClassObject(apt, rclsid, dwClsContext,
+ if (S_OK == InternalGetRegisteredClassObject(apt, rclsid, dwClsContext,
®ClassObject))
{
/* Get the required interface from the retrieved pointer. */
diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index 156b6bb2f44..34fe1e7a381 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -245,31 +245,30 @@ void OLEDD_UnInitialize(void) DECLSPEC_HIDDEN;
/* Apartment Functions */
-struct apartment *apartment_findfromoxid(OXID oxid) DECLSPEC_HIDDEN;
-struct apartment *apartment_findfromtid(DWORD tid) DECLSPEC_HIDDEN;
-void apartment_release(struct apartment *apt) DECLSPEC_HIDDEN;
-HRESULT apartment_disconnectproxies(struct apartment *apt) DECLSPEC_HIDDEN;
+extern struct apartment * WINAPI apartment_findfromoxid(OXID oxid) DECLSPEC_HIDDEN;
+extern struct apartment * WINAPI apartment_findfromtid(DWORD tid) DECLSPEC_HIDDEN;
+extern void WINAPI apartment_release(struct apartment *apt) DECLSPEC_HIDDEN;
static inline HRESULT apartment_getoxid(const struct apartment *apt, OXID *oxid)
{
*oxid = apt->oxid;
return S_OK;
}
-HRESULT apartment_createwindowifneeded(struct apartment *apt) DECLSPEC_HIDDEN;
-HWND apartment_getwindow(const struct apartment *apt) DECLSPEC_HIDDEN;
-HRESULT enter_apartment(struct oletls *info, DWORD model) DECLSPEC_HIDDEN;
-void leave_apartment(struct oletls *info) DECLSPEC_HIDDEN;
-struct apartment *apartment_get_current_or_mta(void) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI apartment_createwindowifneeded(struct apartment *apt) DECLSPEC_HIDDEN;
+extern HWND WINAPI apartment_getwindow(const struct apartment *apt) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI enter_apartment(struct oletls *info, DWORD model) DECLSPEC_HIDDEN;
+void WINAPI leave_apartment(struct oletls *info) DECLSPEC_HIDDEN;
+extern struct apartment * WINAPI apartment_get_current_or_mta(void) DECLSPEC_HIDDEN;
struct class_reg_data;
-HRESULT apartment_get_inproc_class_object(struct apartment *apt, const struct class_reg_data *regdata,
+extern HRESULT WINAPI apartment_get_inproc_class_object(struct apartment *apt, const struct class_reg_data *regdata,
REFCLSID rclsid, REFIID riid, BOOL hostifnecessary, void **ppv) DECLSPEC_HIDDEN;
-void apartment_decrement_mta_usage(CO_MTA_USAGE_COOKIE cookie) DECLSPEC_HIDDEN;
-HRESULT apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie) DECLSPEC_HIDDEN;
-struct apartment *apartment_get_mta(void) DECLSPEC_HIDDEN;
-HRESULT apartment_get_local_server_stream(struct apartment *apt, IStream **ret) DECLSPEC_HIDDEN;
-void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay) DECLSPEC_HIDDEN;
-void apartment_global_cleanup(void) DECLSPEC_HIDDEN;
+extern void WINAPI apartment_decrement_mta_usage(CO_MTA_USAGE_COOKIE cookie) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI apartment_increment_mta_usage(CO_MTA_USAGE_COOKIE *cookie) DECLSPEC_HIDDEN;
+extern struct apartment * WINAPI apartment_get_mta(void) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI apartment_get_local_server_stream(struct apartment *apt, IStream **ret) DECLSPEC_HIDDEN;
+extern void WINAPI apartment_freeunusedlibraries(struct apartment *apt, DWORD delay) DECLSPEC_HIDDEN;
+extern void WINAPI apartment_global_cleanup(void) DECLSPEC_HIDDEN;
HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
DWORD dwClsContext, IUnknown **ppUnk) DECLSPEC_HIDDEN;
diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index 8cc35354d53..d08144f619a 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -1223,7 +1223,7 @@ static BOOL find_proxy_manager(struct apartment * apt, OXID oxid, OID oid, struc
return found;
}
-HRESULT apartment_disconnectproxies(struct apartment *apt)
+HRESULT WINAPI Internal_apartment_disconnectproxies(struct apartment *apt)
{
struct list * cursor;
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 2564851c4b5..4a2e6b531ab 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -298,3 +298,8 @@
@ stub WriteOleStg
@ stub WriteStringStream
@ stdcall InternalIsInitialized()
+@ stdcall InternalGetRegisteredClassObject(ptr ptr long ptr)
+@ stdcall InternalRevokeAllClasses(ptr)
+@ stdcall Internal_apartment_disconnectproxies(ptr)
+@ stdcall Internal_RPC_ExecuteCall(ptr)
+@ stdcall Internal_stub_manager_int_release(ptr)
diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c
index d0b0f49319d..1c88ae21543 100644
--- a/dlls/ole32/rpc.c
+++ b/dlls/ole32/rpc.c
@@ -1324,7 +1324,7 @@ static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat,
return S_OK;
}
-void RPC_ExecuteCall(struct dispatch_params *params)
+void WINAPI Internal_RPC_ExecuteCall(struct dispatch_params *params)
{
struct message_state *message_state = NULL;
RPC_MESSAGE *msg = (RPC_MESSAGE *)params->msg;
@@ -1504,7 +1504,7 @@ static void __RPC_STUB dispatch_rpc(RPC_MESSAGE *msg)
enter_apartment(info, COINIT_MULTITHREADED);
joined = TRUE;
}
- RPC_ExecuteCall(params);
+ Internal_RPC_ExecuteCall(params);
if (joined)
{
leave_apartment(info);
diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c
index 338b89750ef..d38e22adb47 100644
--- a/dlls/ole32/stubmanager.c
+++ b/dlls/ole32/stubmanager.c
@@ -307,6 +307,11 @@ static ULONG stub_manager_int_addref(struct stub_manager *This)
return refs;
}
+ULONG WINAPI Internal_stub_manager_int_release(struct stub_manager *m)
+{
+ return stub_manager_int_release(m);
+}
+
/* decrements the internal refcount */
ULONG stub_manager_int_release(struct stub_manager *This)
{
--
2.28.0
More information about the wine-devel
mailing list