Fixed CoMarshalInterThreadInterfaceInStream and
CoGetInterfaceAndReleaseStream.
This commit is contained in:
parent
c01570cc33
commit
3270bb1ee1
@ -596,45 +596,68 @@ CoReleaseMarshalData(IStream *pStm) {
|
|||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CoMarshalInterThreadInterfaceInStream [OLE32.@]
|
* CoMarshalInterThreadInterfaceInStream [OLE32.@]
|
||||||
*
|
*
|
||||||
* Marshal interfaces across threads. We don't have a thread distinction,
|
* Marshal an interface across threads in the same process.
|
||||||
* meaning most interfaces just work across different threads, the RPC
|
*
|
||||||
* handles it.
|
* PARAMS
|
||||||
|
* riid [I] Identifier of the interface to be marshalled.
|
||||||
|
* pUnk [I] Pointer to IUnknown-derived interface that will be marshalled.
|
||||||
|
* ppStm [O] Pointer to IStream object that is created and then used to store the marshalled inteface.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: S_OK
|
||||||
|
* Failure: E_OUTOFMEMORY and other COM error codes
|
||||||
|
*
|
||||||
|
* SEE
|
||||||
|
* CoMarshalInterface(), CoUnmarshalInterface() and CoGetInterfaceAndReleaseStream()
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI
|
HRESULT WINAPI
|
||||||
CoMarshalInterThreadInterfaceInStream(
|
CoMarshalInterThreadInterfaceInStream(
|
||||||
REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm
|
REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm)
|
||||||
) {
|
{
|
||||||
ULONG res;
|
ULARGE_INTEGER xpos;
|
||||||
ULARGE_INTEGER xpos;
|
LARGE_INTEGER seekto;
|
||||||
LARGE_INTEGER seekto;
|
HRESULT hres;
|
||||||
HRESULT hres;
|
|
||||||
|
|
||||||
TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm);
|
TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm);
|
||||||
hres = CreateStreamOnHGlobal(0, TRUE, ppStm);
|
|
||||||
if (hres) return hres;
|
hres = CreateStreamOnHGlobal(0, TRUE, ppStm);
|
||||||
/* CoMarshalInterface(...); */
|
if (FAILED(hres)) return hres;
|
||||||
hres = IStream_Write(*ppStm,&pUnk,sizeof(LPUNKNOWN),&res);
|
hres = CoMarshalInterface(*ppStm, riid, pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
|
||||||
if (hres) return hres;
|
|
||||||
memset(&seekto,0,sizeof(seekto));
|
/* FIXME: is this needed? */
|
||||||
IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos);
|
memset(&seekto,0,sizeof(seekto));
|
||||||
return S_OK;
|
IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos);
|
||||||
|
|
||||||
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CoGetInterfaceAndReleaseStream [OLE32.@]
|
* CoGetInterfaceAndReleaseStream [OLE32.@]
|
||||||
|
*
|
||||||
|
* Unmarshalls an inteface from a stream and then releases the stream.
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* pStm [I] Stream that contains the marshalled inteface.
|
||||||
|
* riid [I] Interface identifier of the object to unmarshall.
|
||||||
|
* ppv [O] Address of pointer where the requested interface object will be stored.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: S_OK
|
||||||
|
* Failure: A COM error code
|
||||||
|
*
|
||||||
|
* SEE
|
||||||
|
* CoMarshalInterThreadInterfaceInStream() and CoUnmarshalInteface()
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI
|
HRESULT WINAPI
|
||||||
CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) {
|
CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv)
|
||||||
ULONG res;
|
{
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
LPUNKNOWN pUnk;
|
|
||||||
|
|
||||||
TRACE("(,%s,)\n",debugstr_guid(riid));
|
TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
|
||||||
/* CoUnmarshalInterface(...); */
|
|
||||||
hres = IStream_Read(pStm,&pUnk,sizeof(LPUNKNOWN),&res);
|
hres = CoUnmarshalInterface(pStm, riid, ppv);
|
||||||
if (hres) return hres;
|
IStream_Release(pStm);
|
||||||
IStream_Release(pStm);
|
return hres;
|
||||||
return IUnknown_QueryInterface(pUnk,riid,ppv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
|
Loading…
x
Reference in New Issue
Block a user