Zebediah Figura : ole32: Add a helper for grabbing the current apartment or MTA.
Alexandre Julliard
julliard at winehq.org
Tue Apr 10 17:24:28 CDT 2018
Module: wine
Branch: master
Commit: 5e752db1baf5dfe50e4c61c9082118f578dd6a2f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5e752db1baf5dfe50e4c61c9082118f578dd6a2f
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon Apr 9 21:15:47 2018 -0500
ole32: Add a helper for grabbing the current apartment or MTA.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/compobj.c | 48 +++++++++++++++++++++++++-----------------------
1 file changed, 25 insertions(+), 23 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 50ac6d3..2d7a850 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -734,6 +734,19 @@ static APARTMENT *apartment_find_mta(void)
return apt;
}
+/* Return the current apartment if it exists, or, failing that, the MTA. Caller
+ * must free the returned apartment in either case. */
+static APARTMENT *apartment_get_current_or_mta(void)
+{
+ APARTMENT *apt = COM_CurrentApt();
+ if (apt)
+ {
+ apartment_addref(apt);
+ return apt;
+ }
+ return apartment_find_mta();
+}
+
static void COM_RevokeRegisteredClassObject(RegisteredClass *curClass)
{
list_remove(&curClass->entry);
@@ -2997,15 +3010,10 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(
*ppv = NULL;
- if ((apt = COM_CurrentApt()))
- apartment_addref(apt);
- else
+ if (!(apt = apartment_get_current_or_mta()))
{
- if (!(apt = apartment_find_mta()))
- {
- ERR("apartment not initialised\n");
- return CO_E_NOTINITIALIZED;
- }
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
}
if (pServerInfo) {
@@ -3298,15 +3306,12 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstanceEx(
if(FAILED(hres))
clsid = *rclsid;
- if (!(apt = COM_CurrentApt()))
+ if (!(apt = apartment_get_current_or_mta()))
{
- if (!(apt = apartment_find_mta()))
- {
- ERR("apartment not initialised\n");
- return CO_E_NOTINITIALIZED;
- }
- apartment_release(apt);
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
}
+ apartment_release(apt);
/*
* The Standard Global Interface Table (GIT) object is a process-wide singleton.
@@ -4998,22 +5003,19 @@ HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
{
struct oletls *info = COM_CurrentInfo();
+ APARTMENT *apt;
TRACE("(%p)\n", token);
if (!info)
return E_OUTOFMEMORY;
- if (!info->apt)
+ if (!(apt = apartment_get_current_or_mta()))
{
- APARTMENT *apt;
- if (!(apt = apartment_find_mta()))
- {
- ERR("apartment not initialised\n");
- return CO_E_NOTINITIALIZED;
- }
- apartment_release(apt);
+ ERR("apartment not initialised\n");
+ return CO_E_NOTINITIALIZED;
}
+ apartment_release(apt);
if (!token)
return E_POINTER;
More information about the wine-cvs
mailing list