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