From 92599b546e37d3ac5e0da09b859366e72772fc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 16 Jun 2004 07:06:50 +0000 Subject: [PATCH] Sync to Wine-20040615: Marcus Meissner - Revert broken strict aliasing fix. Robert Shearman - Fix ref count on standard proxy creation. - Release channel buffer in StdMarshal_UnmarshalInterface, since we no longer use it and the proxy should have taken a reference on it. - Add a few comments. - Fixed CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream. Patrik Stridvall - Fixed some issues found by winapi_check. svn path=/trunk/; revision=9680 --- reactos/lib/ole32/compobj.c | 4 +- reactos/lib/ole32/datacache.c | 4 +- reactos/lib/ole32/defaulthandler.c | 8 +-- reactos/lib/ole32/filemoniker.c | 6 +- reactos/lib/ole32/ifs.c | 18 +++--- reactos/lib/ole32/itemmoniker.c | 10 +-- reactos/lib/ole32/marshal.c | 98 +++++++++++++++++++----------- reactos/lib/ole32/moniker.c | 2 +- reactos/lib/ole32/ole2.c | 18 +++--- reactos/lib/ole32/ole2impl.c | 4 +- reactos/lib/ole32/oleproxy.c | 7 ++- reactos/lib/ole32/storage32.c | 5 +- 12 files changed, 109 insertions(+), 75 deletions(-) diff --git a/reactos/lib/ole32/compobj.c b/reactos/lib/ole32/compobj.c index e4b955dd578..f66e03824d0 100644 --- a/reactos/lib/ole32/compobj.c +++ b/reactos/lib/ole32/compobj.c @@ -1015,7 +1015,7 @@ _LocalServerThread(LPVOID param) { strcpy(pipefn,PIPEPREF); WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF)); - hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)(char*)&classfac); + hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac); if (hres) return hres; hres = CreateStreamOnHGlobal(0,TRUE,&pStm); @@ -1543,7 +1543,7 @@ HRESULT WINAPI CoCreateInstanceEx( pUnkOuter, dwClsContext, &IID_IUnknown, - (VOID**)(char*)&pUnk); + (VOID**)&pUnk); if (hr) return hr; diff --git a/reactos/lib/ole32/datacache.c b/reactos/lib/ole32/datacache.c index efc97920981..c7cdec28038 100644 --- a/reactos/lib/ole32/datacache.c +++ b/reactos/lib/ole32/datacache.c @@ -1085,7 +1085,7 @@ static HRESULT WINAPI DataCache_GetData( { /* Get the Persist Storage */ - hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)(char*)&pPersistStorage); + hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)&pPersistStorage); if (hr != S_OK) goto cleanup; @@ -1214,7 +1214,7 @@ static HRESULT WINAPI DataCache_IDataObject_SetData( TRACE("(%p, %p, %p, %d)\n", iface, pformatetc, pmedium, fRelease); - hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)(char*)&oleCache); + hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)&oleCache); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/defaulthandler.c b/reactos/lib/ole32/defaulthandler.c index 639e84ec020..5286dad542b 100644 --- a/reactos/lib/ole32/defaulthandler.c +++ b/reactos/lib/ole32/defaulthandler.c @@ -1103,7 +1103,7 @@ static HRESULT WINAPI DefaultHandler_GetExtent( TRACE("(%p, %lx, %p)\n", iface, dwDrawAspect, psizel); - hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)(char*)&cacheView); + hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)&cacheView); if (FAILED(hres)) return E_UNEXPECTED; @@ -1337,7 +1337,7 @@ static HRESULT WINAPI DefaultHandler_GetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1381,7 +1381,7 @@ static HRESULT WINAPI DefaultHandler_QueryGetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; @@ -1434,7 +1434,7 @@ static HRESULT WINAPI DefaultHandler_SetData( hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, - (void**)(char*)&cacheDataObject); + (void**)&cacheDataObject); if (FAILED(hres)) return E_UNEXPECTED; diff --git a/reactos/lib/ole32/filemoniker.c b/reactos/lib/ole32/filemoniker.c index 1345cd8e7c7..0beaca26609 100644 --- a/reactos/lib/ole32/filemoniker.c +++ b/reactos/lib/ole32/filemoniker.c @@ -587,7 +587,7 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, res=GetClassFile(This->filePathName,&clsID); if (SUCCEEDED(res)){ - res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)(char*)&ppf); + res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(res)){ res=IPersistFile_Load(ppf,This->filePathName,STGM_READ); @@ -602,11 +602,11 @@ HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, } } else{ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)(char*)&pcf); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)&pcf); if (res==E_NOINTERFACE){ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)(char*)&pca); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)&pca); if (res==E_NOINTERFACE) return MK_E_INTERMEDIATEINTERFACENOTSUPPORTED; diff --git a/reactos/lib/ole32/ifs.c b/reactos/lib/ole32/ifs.c index d84793435ed..90ad2a8ce8b 100644 --- a/reactos/lib/ole32/ifs.c +++ b/reactos/lib/ole32/ifs.c @@ -144,7 +144,7 @@ static HRESULT WINAPI IMalloc_fnQueryInterface(LPMALLOC iface,REFIID refiid,LPVO TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMalloc,refiid)) { - *obj = (LPMALLOC)(char*)&Malloc32; + *obj = (LPMALLOC)&Malloc32; return S_OK; } return E_NOINTERFACE; @@ -380,7 +380,7 @@ static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refii TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { - *obj = (LPMALLOC)(char*)&MallocSpy; + *obj = (LPMALLOC)&MallocSpy; return S_OK; } return E_NOINTERFACE; @@ -530,7 +530,7 @@ static ICOM_VTABLE(IMallocSpy) VT_IMallocSpy = */ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) { - *lpMalloc = (LPMALLOC)(char*)&Malloc32; + *lpMalloc = (LPMALLOC)&Malloc32; return S_OK; } @@ -541,14 +541,14 @@ HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC *lpMalloc) */ LPVOID WINAPI CoTaskMemAlloc(ULONG size) { - return IMalloc_Alloc((LPMALLOC)(char*)&Malloc32,size); + return IMalloc_Alloc((LPMALLOC)&Malloc32,size); } /*********************************************************************** * CoTaskMemFree [OLE32.@] */ VOID WINAPI CoTaskMemFree(LPVOID ptr) { - IMalloc_Free((LPMALLOC)(char*)&Malloc32, ptr); + IMalloc_Free((LPMALLOC)&Malloc32, ptr); } /*********************************************************************** @@ -558,7 +558,7 @@ VOID WINAPI CoTaskMemFree(LPVOID ptr) */ LPVOID WINAPI CoTaskMemRealloc(LPVOID pvOld, ULONG size) { - return IMalloc_Realloc((LPMALLOC)(char*)&Malloc32, pvOld, size); + return IMalloc_Realloc((LPMALLOC)&Malloc32, pvOld, size); } /*********************************************************************** @@ -576,13 +576,13 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); /* HACK TO ACTIVATE OUT SPY */ - if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)(char*)&MallocSpy; + if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); - if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)(char*)&pSpy))) { + if (SUCCEEDED(IUnknown_QueryInterface(pMallocSpy, &IID_IMallocSpy, (LPVOID*)&pSpy))) { Malloc32.pSpy = pSpy; hres = S_OK; } @@ -607,7 +607,7 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); /* if it's our spy it's time to dump the leaks */ - if (Malloc32.pSpy == (IMallocSpy*)(char*)&MallocSpy) { + if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { MallocSpyDumpLeaks(); } diff --git a/reactos/lib/ole32/itemmoniker.c b/reactos/lib/ole32/itemmoniker.c index 6c1d71ff775..b426f712f13 100644 --- a/reactos/lib/ole32/itemmoniker.c +++ b/reactos/lib/ole32/itemmoniker.c @@ -454,7 +454,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface, *ppvResult=0; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic); if (SUCCEEDED(res)){ @@ -487,7 +487,7 @@ HRESULT WINAPI ItemMonikerImpl_BindToStorage(IMoniker* iface, if(pmkToLeft==NULL) return E_INVALIDARG; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ @@ -715,7 +715,7 @@ HRESULT WINAPI ItemMonikerImpl_IsRunning(IMoniker* iface, /* requesting an IOleItemContainer interface pointer. The method then calls IOleItemContainer::IsRunning,*/ /* passing the string contained within this moniker. */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ @@ -876,11 +876,11 @@ HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(IMoniker* iface, /* Otherwise, the method calls IMoniker::BindToObject on the pmkToLeft parameter, requesting an */ /* IParseDisplayName interface pointer to the object identified by the moniker, and passes the display */ /* name to IParseDisplayName::ParseDisplayName */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)(char*)&poic); + res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ - res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)(char*)&ppdn); + res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)&ppdn); res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName); diff --git a/reactos/lib/ole32/marshal.c b/reactos/lib/ole32/marshal.c index e49aae716aa..662f1b07a6c 100644 --- a/reactos/lib/ole32/marshal.c +++ b/reactos/lib/ole32/marshal.c @@ -256,7 +256,7 @@ StdMarshalImpl_MarshalInterface( IPSFactoryBuffer *psfacbuf; TRACE("(...,%s,...)\n",debugstr_guid(riid)); - IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)(char*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk); mid.processid = GetCurrentProcessId(); mid.objectid = (DWORD)pUnk; /* FIXME */ IUnknown_Release(pUnk); @@ -280,7 +280,7 @@ StdMarshalImpl_MarshalInterface( FIXME("Failed to create a stub for %s\n",debugstr_guid(riid)); return hres; } - IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)(char*)&pUnk); + IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)&pUnk); MARSHAL_Register_Stub(&mid,pUnk,stub); IUnknown_Release(pUnk); return S_OK; @@ -315,13 +315,20 @@ StdMarshalImpl_UnmarshalInterface( return hres; } hres = PIPE_GetNewPipeBuf(&mid,&chanbuf); + IPSFactoryBuffer_Release(psfacbuf); if (hres) { ERR("Failed to get an rpc channel buffer for %s\n",debugstr_guid(riid)); } else { + /* Connect the channel buffer to the proxy and release the no longer + * needed proxy. + * NOTE: The proxy should have taken an extra reference because it also + * aggregates the object, so we can safely release our reference to it. */ IRpcProxyBuffer_Connect(rpcproxy,chanbuf); - IRpcProxyBuffer_Release(rpcproxy); /* no need */ + IRpcProxyBuffer_Release(rpcproxy); + /* IRpcProxyBuffer takes a reference on the channel buffer and + * we no longer need it, so release it */ + IRpcChannelBuffer_Release(chanbuf); } - IPSFactoryBuffer_Release(psfacbuf); return hres; } @@ -448,7 +455,7 @@ CoMarshalInterface( IStream *pStm, REFIID riid, IUnknown *pUnk, ); STUBMGR_Start(); /* Just to be sure we have one running. */ mid.processid = GetCurrentProcessId(); - IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)(char*)&pUnknown); + IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)&pUnknown); mid.objectid = (DWORD)pUnknown; IUnknown_Release(pUnknown); memcpy(&mid.iid,riid,sizeof(mid.iid)); @@ -523,7 +530,7 @@ CoUnmarshalInterface(IStream *pStm, REFIID riid, LPVOID *ppv) { FIXME("Stream read 3 failed, %lx, (%ld of %d)\n",hres,res,sizeof(xclsid)); return hres; } - hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)(char*)&pUnk); + hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,(void**)&pUnk); if (hres) { FIXME("Failed to create instance of unmarshaller %s.\n",debugstr_guid(&xclsid)); return hres; @@ -596,45 +603,68 @@ CoReleaseMarshalData(IStream *pStm) { /*********************************************************************** * CoMarshalInterThreadInterfaceInStream [OLE32.@] * - * Marshal interfaces across threads. We don't have a thread distinction, - * meaning most interfaces just work across different threads, the RPC - * handles it. + * Marshal an interface across threads in the same process. + * + * 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 CoMarshalInterThreadInterfaceInStream( - REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm -) { - ULONG res; - ULARGE_INTEGER xpos; - LARGE_INTEGER seekto; - HRESULT hres; + REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm) +{ + ULARGE_INTEGER xpos; + LARGE_INTEGER seekto; + HRESULT hres; - TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm); - hres = CreateStreamOnHGlobal(0, TRUE, ppStm); - if (hres) return hres; - /* CoMarshalInterface(...); */ - hres = IStream_Write(*ppStm,&pUnk,sizeof(LPUNKNOWN),&res); - if (hres) return hres; - memset(&seekto,0,sizeof(seekto)); - IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos); - return S_OK; + TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm); + + hres = CreateStreamOnHGlobal(0, TRUE, ppStm); + if (FAILED(hres)) return hres; + hres = CoMarshalInterface(*ppStm, riid, pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + + /* FIXME: is this needed? */ + memset(&seekto,0,sizeof(seekto)); + IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos); + + return hres; } /*********************************************************************** * 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 -CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) { - ULONG res; - HRESULT hres; - LPUNKNOWN pUnk; +CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) +{ + HRESULT hres; - TRACE("(,%s,)\n",debugstr_guid(riid)); - /* CoUnmarshalInterface(...); */ - hres = IStream_Read(pStm,&pUnk,sizeof(LPUNKNOWN),&res); - if (hres) return hres; - IStream_Release(pStm); - return IUnknown_QueryInterface(pUnk,riid,ppv); + TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv); + + hres = CoUnmarshalInterface(pStm, riid, ppv); + IStream_Release(pStm); + return hres; } static HRESULT WINAPI diff --git a/reactos/lib/ole32/moniker.c b/reactos/lib/ole32/moniker.c index ff619292df1..f5cbcaffe92 100644 --- a/reactos/lib/ole32/moniker.c +++ b/reactos/lib/ole32/moniker.c @@ -505,7 +505,7 @@ HRESULT WINAPI OleRun(LPUNKNOWN pUnknown) ICOM_THIS(IRunnableObject,pUnknown); LRESULT ret; - ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)(char*)&runable); + ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)&runable); if (ret) return 0; /* Appears to return no error. */ ret = IRunnableObject_Run(runable,NULL); diff --git a/reactos/lib/ole32/ole2.c b/reactos/lib/ole32/ole2.c index b690ccf907f..efeb81e597c 100644 --- a/reactos/lib/ole32/ole2.c +++ b/reactos/lib/ole32/ole2.c @@ -710,7 +710,7 @@ HRESULT WINAPI OleSetContainedObject( hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)(char*)&runnable); + (void**)&runnable); if (SUCCEEDED(hres)) { @@ -756,7 +756,7 @@ HRESULT WINAPI OleLoad( NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, - (void**)(char*)&oleObject); + (void**)&oleObject); /* * If that fails, as it will most times, load the default @@ -767,7 +767,7 @@ HRESULT WINAPI OleLoad( hres = OleCreateDefaultHandler(&storageInfo.clsid, NULL, &IID_IOleObject, - (void**)(char*)&oleObject); + (void**)&oleObject); } /* @@ -786,7 +786,7 @@ HRESULT WINAPI OleLoad( */ hres = IOleObject_QueryInterface(oleObject, &IID_IPersistStorage, - (void**)(char*)&persistStorage); + (void**)&persistStorage); if (SUCCEEDED(hres)) { @@ -860,7 +860,7 @@ HRESULT WINAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCl hres = IUnknown_QueryInterface(pUnknown, &IID_IRunnableObject, - (void**)(char*)&runnable); + (void**)&runnable); if (SUCCEEDED(hres)) { @@ -2229,7 +2229,7 @@ HRESULT WINAPI OleDraw( hres = IUnknown_QueryInterface(pUnk, &IID_IViewObject, - (void**)(char*)&viewobject); + (void**)&viewobject); if (SUCCEEDED(hres)) { @@ -2284,20 +2284,20 @@ HRESULT WINAPI OleCreate( FIXME("\n\t%s\n\t%s semi-stub!\n", debugstr_guid(rclsid), debugstr_guid(riid)); - if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)(char*)&pUnk)))) + if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, (LPVOID*)&pUnk)))) { if (pClientSite) { IOleObject * pOE; IPersistStorage * pPS; - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)(char*)&pOE)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE)))) { TRACE("trying to set clientsite %p\n", pClientSite); hres1 = IOleObject_SetClientSite(pOE, pClientSite); TRACE("-- result 0x%08lx\n", hres1); IOleObject_Release(pOE); } - if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)(char*)&pPS)))) + if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS)))) { TRACE("trying to set stg %p\n", pStg); hres1 = IPersistStorage_InitNew(pPS, pStg); diff --git a/reactos/lib/ole32/ole2impl.c b/reactos/lib/ole32/ole2impl.c index 6dc79d010e8..903c5e7416d 100644 --- a/reactos/lib/ole32/ole2impl.c +++ b/reactos/lib/ole32/ole2impl.c @@ -151,7 +151,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Create default handler for Persist storage */ if (hr1 == S_OK) - hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)(char*)&pPersistStorage); + hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)&pPersistStorage); /* Load the storage to Persist storage */ @@ -161,7 +161,7 @@ HRESULT WINAPI OleCreateFromData(LPDATAOBJECT pSrcDataObject, REFIID riid, /* Query for IOleObject */ if (hr1 == S_OK) - hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)(char*)&pOleObject); + hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)&pOleObject); /* Set client site with the IOleObject */ diff --git a/reactos/lib/ole32/oleproxy.c b/reactos/lib/ole32/oleproxy.c index 6c117d2718c..f92ca5a832f 100644 --- a/reactos/lib/ole32/oleproxy.c +++ b/reactos/lib/ole32/oleproxy.c @@ -156,12 +156,12 @@ CFStub_Invoke( } memcpy(&iid,msg->Buffer,sizeof(iid)); TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid)); - hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)(char*)&classfac); + hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac); if (hres) { FIXME("Ole server does not provide a IClassFactory?\n"); return hres; } - hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)(char*)&ppv); + hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv); IClassFactory_Release(classfac); if (hres) { msg->cbBuffer = 0; @@ -436,7 +436,8 @@ CFProxy_Construct(LPVOID *ppv,LPVOID *ppProxy) { cf->lpvtbl_cf = &cfproxyvt; cf->lpvtbl_proxy = &pspbvtbl; - cf->ref = 2; /* we return 2 references to the object! */ + /* 1 reference for the proxy and 1 for the object */ + cf->ref = 2; *ppv = &(cf->lpvtbl_cf); *ppProxy = &(cf->lpvtbl_proxy); return S_OK; diff --git a/reactos/lib/ole32/storage32.c b/reactos/lib/ole32/storage32.c index 7c7ff8e5ee7..c182b8aae06 100644 --- a/reactos/lib/ole32/storage32.c +++ b/reactos/lib/ole32/storage32.c @@ -5536,6 +5536,9 @@ HRESULT WINAPI StgCreateDocfile( return hr; } +/****************************************************************************** + * StgCreateStorageEx [OLE32.@] + */ HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD stgfmt, DWORD grfAttrs, STGOPTIONS* pStgOptions, void* reserved, REFIID riid, void** ppObjectOpen) { TRACE("(%s, %lx, %lx, %lx, %p, %p, %p, %p)\n", debugstr_w(pwcsName), @@ -5898,7 +5901,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj); if (!SUCCEEDED(res)) return res; - res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)(char*)&xstm); + res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)&xstm); if (!SUCCEEDED(res)) { IUnknown_Release((IUnknown*)*ppvObj); return res;