Rob Shearman : ole32: Ignore the threading model of the PSFactoryBuffer object created during standard marshaling .

Alexandre Julliard julliard at winehq.org
Mon Dec 3 09:17:41 CST 2007


Module: wine
Branch: master
Commit: 31b2d81ea078ec03b240ae0b14fb7830da8b078f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=31b2d81ea078ec03b240ae0b14fb7830da8b078f

Author: Rob Shearman <rob at codeweavers.com>
Date:   Fri Nov 30 18:08:08 2007 +0000

ole32: Ignore the threading model of the PSFactoryBuffer object created during standard marshaling.

This is so that we don't try to host it.

---

 dlls/ole32/compobj.c         |   76 +++++++++++++++++++++++++-----------------
 dlls/ole32/compobj_private.h |    2 +
 dlls/ole32/marshal.c         |    4 +-
 3 files changed, 49 insertions(+), 33 deletions(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 6cee5b9..7ef613e 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -79,7 +79,7 @@ HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
 static HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
                                             DWORD dwClsContext, LPUNKNOWN*  ppUnk);
 static void COM_RevokeAllClasses(const struct apartment *apt);
-static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv);
+static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll, REFCLSID rclsid, REFIID riid, BOOL hostifnecessary, void **ppv);
 
 static APARTMENT *MTA; /* protected by csApartment */
 static APARTMENT *MainApartment; /* the first STA apartment */
@@ -2087,38 +2087,51 @@ static void get_threading_model(HKEY key, LPWSTR value, DWORD len)
 }
 
 static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll,
-                                       REFCLSID rclsid, REFIID riid, void **ppv)
+                                       REFCLSID rclsid, REFIID riid,
+                                       BOOL hostifnecessary, void **ppv)
 {
-    static const WCHAR wszApartment[] = {'A','p','a','r','t','m','e','n','t',0};
-    static const WCHAR wszFree[] = {'F','r','e','e',0};
-    static const WCHAR wszBoth[] = {'B','o','t','h',0};
     WCHAR dllpath[MAX_PATH+1];
-    WCHAR threading_model[10 /* strlenW(L"apartment")+1 */];
+    BOOL apartment_threaded;
 
-    get_threading_model(hkeydll, threading_model, ARRAYSIZE(threading_model));
-    /* "Apartment" */
-    if (!strcmpiW(threading_model, wszApartment))
+    if (hostifnecessary)
     {
-        if (apt->multi_threaded)
-            return apartment_hostobject_in_hostapt(apt, FALSE, FALSE, hkeydll, rclsid, riid, ppv);
-    }
-    /* "Free" */
-    else if (!strcmpiW(threading_model, wszFree))
-    {
-        if (!apt->multi_threaded)
-            return apartment_hostobject_in_hostapt(apt, TRUE, FALSE, hkeydll, rclsid, riid, ppv);
-    }
-    /* everything except "Apartment", "Free" and "Both" */
-    else if (strcmpiW(threading_model, wszBoth))
-    {
-        /* everything else is main-threaded */
-        if (threading_model[0])
-            FIXME("unrecognised threading model %s for object %s, should be main-threaded?\n",
-                debugstr_w(threading_model), debugstr_guid(rclsid));
+        static const WCHAR wszApartment[] = {'A','p','a','r','t','m','e','n','t',0};
+        static const WCHAR wszFree[] = {'F','r','e','e',0};
+        static const WCHAR wszBoth[] = {'B','o','t','h',0};
+        WCHAR threading_model[10 /* strlenW(L"apartment")+1 */];
 
-        if (apt->multi_threaded || !apt->main)
-            return apartment_hostobject_in_hostapt(apt, FALSE, TRUE, hkeydll, rclsid, riid, ppv);
+        get_threading_model(hkeydll, threading_model, ARRAYSIZE(threading_model));
+        /* "Apartment" */
+        if (!strcmpiW(threading_model, wszApartment))
+        {
+            apartment_threaded = TRUE;
+            if (apt->multi_threaded)
+                return apartment_hostobject_in_hostapt(apt, FALSE, FALSE, hkeydll, rclsid, riid, ppv);
+        }
+        /* "Free" */
+        else if (!strcmpiW(threading_model, wszFree))
+        {
+            apartment_threaded = FALSE;
+            if (!apt->multi_threaded)
+                return apartment_hostobject_in_hostapt(apt, TRUE, FALSE, hkeydll, rclsid, riid, ppv);
+        }
+        /* everything except "Apartment", "Free" and "Both" */
+        else if (strcmpiW(threading_model, wszBoth))
+        {
+            apartment_threaded = TRUE;
+            /* everything else is main-threaded */
+            if (threading_model[0])
+                FIXME("unrecognised threading model %s for object %s, should be main-threaded?\n",
+                    debugstr_w(threading_model), debugstr_guid(rclsid));
+
+            if (apt->multi_threaded || !apt->main)
+                return apartment_hostobject_in_hostapt(apt, FALSE, TRUE, hkeydll, rclsid, riid, ppv);
+        }
+        else
+            apartment_threaded = FALSE;
     }
+    else
+        apartment_threaded = !apt->multi_threaded;
 
     if (COM_RegReadPath(hkeydll, NULL, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
     {
@@ -2127,8 +2140,7 @@ static HRESULT get_inproc_class_object(APARTMENT *apt, HKEY hkeydll,
         return REGDB_E_CLASSNOTREG;
     }
 
-    return apartment_getclassobject(apt, dllpath,
-                                    !strcmpiW(threading_model, wszApartment),
+    return apartment_getclassobject(apt, dllpath, apartment_threaded,
                                     rclsid, riid, ppv);
 }
 
@@ -2228,7 +2240,8 @@ HRESULT WINAPI CoGetClassObject(
 
         if (SUCCEEDED(hres))
         {
-            hres = get_inproc_class_object(apt, hkey, rclsid, iid, ppv);
+            hres = get_inproc_class_object(apt, hkey, rclsid, iid,
+                !(dwClsContext & WINE_CLSCTX_DONT_HOST), ppv);
             RegCloseKey(hkey);
         }
 
@@ -2258,7 +2271,8 @@ HRESULT WINAPI CoGetClassObject(
 
         if (SUCCEEDED(hres))
         {
-            hres = get_inproc_class_object(apt, hkey, rclsid, iid, ppv);
+            hres = get_inproc_class_object(apt, hkey, rclsid, iid,
+                !(dwClsContext & WINE_CLSCTX_DONT_HOST), ppv);
             RegCloseKey(hkey);
         }
 
diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h
index f99a89f..1c49956 100644
--- a/dlls/ole32/compobj_private.h
+++ b/dlls/ole32/compobj_private.h
@@ -307,6 +307,8 @@ extern HINSTANCE OLE32_hInstance; /* FIXME: make static */
 
 #define CHARS_IN_GUID 39 /* including NULL */
 
+#define WINE_CLSCTX_DONT_HOST   0x80000000
+
 /* Exported non-interface Data Advise Holder functions */
 HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate);
 void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface);
diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index fde189a..32dadb1 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -76,8 +76,8 @@ static inline HRESULT get_facbuf_for_iid(REFIID riid, IPSFactoryBuffer **facbuf)
 
     if ((hr = CoGetPSClsid(riid, &clsid)))
         return hr;
-    return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL,
-        &IID_IPSFactoryBuffer, (LPVOID*)facbuf);
+    return CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER | WINE_CLSCTX_DONT_HOST,
+        NULL, &IID_IPSFactoryBuffer, (LPVOID*)facbuf);
 }
 
 /* marshals an object into a STDOBJREF structure */




More information about the wine-cvs mailing list