Module: wine Branch: refs/heads/master Commit: 628371021bddc7440724ed4b79e5fe4a9c335d1d URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=628371021bddc7440724ed4b...
Author: Robert Shearman rob@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(); }