Fixed OleLoadFromStream: Dereference ppvObj and get IPersistStream
instead of accessing IUnknown.
This commit is contained in:
parent
f9b6d7bb27
commit
52475287da
|
@ -5686,22 +5686,30 @@ HRESULT WINAPI ReadClassStg(IStorage *pstg,CLSID *pclsid){
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvObj)
|
HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvObj)
|
||||||
{
|
{
|
||||||
CLSID clsid;
|
CLSID clsid;
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
LPPERSISTSTREAM xstm;
|
||||||
|
|
||||||
FIXME("(),stub!\n");
|
TRACE("(%p,%s,%p)\n",pStm,debugstr_guid(iidInterface),ppvObj);
|
||||||
|
|
||||||
res=ReadClassStm(pStm,&clsid);
|
res=ReadClassStm(pStm,&clsid);
|
||||||
|
if (!SUCCEEDED(res))
|
||||||
if (SUCCEEDED(res)){
|
return res;
|
||||||
|
res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj);
|
||||||
res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj);
|
if (!SUCCEEDED(res))
|
||||||
|
return res;
|
||||||
if (SUCCEEDED(res))
|
res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)&xstm);
|
||||||
|
if (!SUCCEEDED(res)) {
|
||||||
res=IPersistStream_Load((IPersistStream*)ppvObj,pStm);
|
IUnknown_Release((IUnknown*)*ppvObj);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
res=IPersistStream_Load(xstm,pStm);
|
||||||
|
IPersistStream_Release(xstm);
|
||||||
|
/* FIXME: all refcounts ok at this point? I think they should be:
|
||||||
|
* pStm : unchanged
|
||||||
|
* ppvObj : 1
|
||||||
|
* xstm : 0 (released)
|
||||||
|
*/
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue