[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-patches
Subject:    ole32: When CoLockObjectExternal with fLock=TRUE is used on an
From:       Robert Shearman <rob () codeweavers ! com>
Date:       2006-06-30 10:07:43
Message-ID: 44A4F7EF.3080202 () codeweavers ! com
[Download RAW message or body]

---

  dlls/ole32/compobj.c       |   16 ++++++++++++++++
  dlls/ole32/tests/marshal.c |   20 +++++++++++++++++++-
  2 files changed, 35 insertions(+), 1 deletions(-)


["12f35ba2c40993c9c06e8f4489f320da62e76984.diff" (text/x-patch)]

12f35ba2c40993c9c06e8f4489f320da62e76984
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index fc65ddb..f66926c 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -2098,6 +2098,10 @@ static void COM_RevokeAllClasses()
  * RETURNS
  *  Success: S_OK.
  *  Failure: HRESULT code.
+ *
+ * NOTES
+ *  If fLock is TRUE and an object is passed in that doesn't have a stub
+ *  manager then a new stub manager is created for the object.
  */
 HRESULT WINAPI CoLockObjectExternal(
     LPUNKNOWN pUnk,
@@ -2126,6 +2130,18 @@ HRESULT WINAPI CoLockObjectExternal(
 
         return S_OK;
     }
+    else if (fLock)
+    {
+        stubmgr = new_stub_manager(apt, pUnk);
+
+        if (stubmgr)
+        {
+            stub_manager_ext_addref(stubmgr, 1);
+            stub_manager_int_release(stubmgr);
+        }
+
+        return S_OK;
+    }
     else
     {
         WARN("stub object not found %p\n", pUnk);
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index 102be87..fc7c205 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -998,6 +998,20 @@ static void test_lock_object_external(vo
 
     cLocks = 0;
 
+    /* test the stub manager creation aspect of CoLockObjectExternal when the
+     * object hasn't been marshaled yet */
+    CoLockObjectExternal((IUnknown*)&Test_ClassFactory, TRUE, TRUE);
+
+    ok_more_than_one_lock();
+
+    CoDisconnectObject((IUnknown*)&Test_ClassFactory, 0);
+
+    ok_no_locks();
+
+    /* test our empty stub manager being handled correctly in
+     * CoMarshalInterface */
+    CoLockObjectExternal((IUnknown*)&Test_ClassFactory, TRUE, TRUE);
+
     hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
     ok_ole_success(hr, CreateStreamOnHGlobal);
     hr = CoMarshalInterface(pStream, &IID_IClassFactory, \
(IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); @@ -1006,7 \
+1020,7 @@ static void test_lock_object_external(vo  \
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, TRUE, TRUE);  
     ok_more_than_one_lock();
-    
+
     IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
     hr = CoReleaseMarshalData(pStream);
     ok_ole_success(hr, CoReleaseMarshalData);
@@ -1016,6 +1030,10 @@ static void test_lock_object_external(vo
 
     CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
 
+    ok_more_than_one_lock();
+
+    CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
+
     ok_no_locks();
 }
 





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic