[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