ole32: Implement table-strong marshaling and ReleaseMarshalData for the free-threaded marshaler.
This commit is contained in:
parent
f9b5280dd0
commit
2c57189a97
|
@ -262,7 +262,7 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid,
|
|||
if (hres != S_OK) return STG_E_READFAULT;
|
||||
|
||||
hres = IUnknown_QueryInterface(object, riid, ppv);
|
||||
if (!(mshlflags & MSHLFLAGS_TABLEWEAK))
|
||||
if (!(mshlflags & (MSHLFLAGS_TABLEWEAK|MSHLFLAGS_TABLESTRONG)))
|
||||
IUnknown_Release(object);
|
||||
return hres;
|
||||
}
|
||||
|
@ -270,13 +270,49 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid,
|
|||
|
||||
static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream * pStm)
|
||||
{
|
||||
FIXME ("(), stub!\n");
|
||||
return S_OK;
|
||||
DWORD mshlflags;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE ("(%p)\n", pStm);
|
||||
|
||||
hres = IStream_Read (pStm, &mshlflags, sizeof (mshlflags), NULL);
|
||||
if (hres != S_OK) return STG_E_READFAULT;
|
||||
|
||||
if (mshlflags == 0x57dfd54d /* MEOW */) {
|
||||
IMarshal *pMarshal;
|
||||
|
||||
hres = CoCreateInstance (&CLSID_DfMarshal, NULL, CLSCTX_INPROC, &IID_IMarshal, (void **)&pMarshal);
|
||||
if (FAILED(hres)) return hres;
|
||||
|
||||
hres = IMarshal_ReleaseMarshalData (pMarshal, pStm);
|
||||
IMarshal_Release (pMarshal);
|
||||
return hres;
|
||||
}
|
||||
else {
|
||||
IUnknown *object;
|
||||
DWORD constant;
|
||||
GUID unknown_guid;
|
||||
|
||||
hres = IStream_Read (pStm, &object, sizeof (object), NULL);
|
||||
if (hres != S_OK) return STG_E_READFAULT;
|
||||
|
||||
hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
|
||||
if (hres != S_OK) return STG_E_READFAULT;
|
||||
if (constant != 0)
|
||||
FIXME("constant is 0x%lx instead of 0\n", constant);
|
||||
|
||||
hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
|
||||
if (hres != S_OK) return STG_E_READFAULT;
|
||||
|
||||
IUnknown_Release(object);
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
|
||||
static HRESULT WINAPI FTMarshalImpl_DisconnectObject (LPMARSHAL iface, DWORD dwReserved)
|
||||
{
|
||||
FIXME ("(), stub!\n");
|
||||
TRACE ("()\n");
|
||||
/* nothing to do */
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -1718,7 +1718,7 @@ static void test_freethreadedmarshaler(void)
|
|||
|
||||
IUnknown_Release(pProxy);
|
||||
|
||||
todo_wine ok_more_than_one_lock();
|
||||
ok_more_than_one_lock();
|
||||
|
||||
IStream_Seek(pStream, llZero, STREAM_SEEK_SET, NULL);
|
||||
hr = IMarshal_ReleaseMarshalData(pFTMarshal, pStream);
|
||||
|
@ -1767,7 +1767,7 @@ static void test_freethreadedmarshaler(void)
|
|||
hr = IMarshal_ReleaseMarshalData(pFTMarshal, pStream);
|
||||
ok_ole_success(hr, IMarshal_ReleaseMarshalData);
|
||||
|
||||
todo_wine ok_no_locks();
|
||||
ok_no_locks();
|
||||
|
||||
/* doesn't enforce marshaling rules here and allows us to unmarshal the
|
||||
* interface, even though it was freed above */
|
||||
|
@ -1775,7 +1775,7 @@ static void test_freethreadedmarshaler(void)
|
|||
hr = IMarshal_UnmarshalInterface(pFTMarshal, pStream, &IID_IUnknown, (void **)&pProxy);
|
||||
ok_ole_success(hr, IMarshal_UnmarshalInterface);
|
||||
|
||||
todo_wine ok_no_locks();
|
||||
ok_no_locks();
|
||||
|
||||
IStream_Release(pStream);
|
||||
IMarshal_Release(pFTMarshal);
|
||||
|
|
Loading…
Reference in New Issue