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.
This commit is contained in:
parent
2fa3cc03a5
commit
628371021b
|
@ -2098,6 +2098,10 @@ static void COM_RevokeAllClasses()
|
||||||
* RETURNS
|
* RETURNS
|
||||||
* Success: S_OK.
|
* Success: S_OK.
|
||||||
* Failure: HRESULT code.
|
* 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(
|
HRESULT WINAPI CoLockObjectExternal(
|
||||||
LPUNKNOWN pUnk,
|
LPUNKNOWN pUnk,
|
||||||
|
@ -2126,6 +2130,18 @@ HRESULT WINAPI CoLockObjectExternal(
|
||||||
|
|
||||||
return S_OK;
|
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
|
else
|
||||||
{
|
{
|
||||||
WARN("stub object not found %p\n", pUnk);
|
WARN("stub object not found %p\n", pUnk);
|
||||||
|
|
|
@ -998,6 +998,20 @@ static void test_lock_object_external(void)
|
||||||
|
|
||||||
cLocks = 0;
|
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);
|
hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
|
||||||
ok_ole_success(hr, CreateStreamOnHGlobal);
|
ok_ole_success(hr, CreateStreamOnHGlobal);
|
||||||
hr = CoMarshalInterface(pStream, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
|
hr = CoMarshalInterface(pStream, &IID_IClassFactory, (IUnknown*)&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
|
||||||
|
@ -1016,6 +1030,10 @@ static void test_lock_object_external(void)
|
||||||
|
|
||||||
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
|
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
|
||||||
|
|
||||||
|
ok_more_than_one_lock();
|
||||||
|
|
||||||
|
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, TRUE);
|
||||||
|
|
||||||
ok_no_locks();
|
ok_no_locks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue