Robert Shearman : ole32: When CoLockObjectExternal with fLock= TRUE is used on an object

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 30 14:15:14 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 628371021bddc7440724ed4b79e5fe4a9c335d1d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=628371021bddc7440724ed4b79e5fe4a9c335d1d

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri Jun 30 11:07:43 2006 +0100

ole32: When CoLockObjectExternal with fLock=TRUE is used on an object
that hasn't yet been marshaled then it should create a new stub
manager.

---

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

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();
 }
 




More information about the wine-cvs mailing list