PATCH: aliasing problems in ole32
Marcus Meissner
marcus at jet.franken.de
Sat Apr 26 04:11:22 CDT 2003
Hi,
This fixing some of the pointer aliasing problems in
dlls/ole32.
(The compiler can assume that (void**)&ptr and ptr are
different entities, have nothing to do with each other
and move code around where it might break.)
Ciao, Marcus
Changelog:
Fixed some warnings from newer gccs in regards to
pointer aliasing problems by using unions instead of
using (void**)&ptr constructs.
Index: dlls/ole32/compobj.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compobj.c,v
retrieving revision 1.73
diff -u -r1.73 compobj.c
--- dlls/ole32/compobj.c 11 Mar 2003 01:45:39 -0000 1.73
+++ dlls/ole32/compobj.c 26 Apr 2003 09:05:37 -0000
@@ -865,16 +865,19 @@
STATSTG ststg;
unsigned char *buffer;
int buflen;
- IClassFactory *classfac;
LARGE_INTEGER seekto;
ULARGE_INTEGER newpos;
ULONG res;
+ union {
+ LPVOID vptr;
+ IClassFactory *pcfac;
+ } xcf;
TRACE("Starting threader for %s.\n",debugstr_guid(&newClass->classIdentifier));
strcpy(pipefn,PIPEPREF);
WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF));
- hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac);
+ hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,&xcf.vptr);
if (hres) return hres;
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
@@ -882,7 +885,7 @@
FIXME("Failed to create stream on hglobal.\n");
return hres;
}
- hres = CoMarshalInterface(pStm,&IID_IClassFactory,(LPVOID)classfac,0,NULL,0);
+ hres = CoMarshalInterface(pStm,&IID_IClassFactory,xcf.vptr,0,NULL,0);
if (hres) {
FIXME("CoMarshalInterface failed, %lx!\n",hres);
return hres;
@@ -1306,8 +1309,11 @@
REFIID iid,
LPVOID *ppv)
{
- HRESULT hres;
- LPCLASSFACTORY lpclf = 0;
+ HRESULT hres;
+ union {
+ LPVOID vptr;
+ LPCLASSFACTORY lpclf;
+ } xcf;
/*
* Sanity check
@@ -1341,7 +1347,7 @@
dwClsContext,
NULL,
&IID_IClassFactory,
- (LPVOID)&lpclf);
+ &xcf.vptr);
if (FAILED(hres)) {
FIXME("no classfactory created for CLSID %s, hres is 0x%08lx\n",
@@ -1352,8 +1358,8 @@
/*
* Create the object and don't forget to release the factory
*/
- hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv);
- IClassFactory_Release(lpclf);
+ hres = IClassFactory_CreateInstance(xcf.lpclf, pUnkOuter, iid, ppv);
+ IClassFactory_Release(xcf.lpclf);
if(FAILED(hres))
FIXME("no instance created for interface %s of class %s, hres is 0x%08lx\n",
debugstr_guid(iid), debugstr_guid(rclsid),hres);
@@ -1372,10 +1378,13 @@
ULONG cmq,
MULTI_QI* pResults)
{
- IUnknown* pUnk = NULL;
HRESULT hr;
ULONG index;
int successCount = 0;
+ union {
+ LPVOID vptr;
+ LPUNKNOWN punk;
+ } xunk;
/*
* Sanity check
@@ -1402,8 +1411,7 @@
pUnkOuter,
dwClsContext,
&IID_IUnknown,
- (VOID**)&pUnk);
-
+ &xunk.vptr);
if (hr)
return hr;
@@ -1412,10 +1420,15 @@
*/
for (index = 0; index < cmq; index++)
{
- pResults[index].hr = IUnknown_QueryInterface(pUnk,
+ union {
+ LPVOID vptr;
+ LPUNKNOWN punk;
+ } xunk2;
+ pResults[index].hr = IUnknown_QueryInterface(xunk.punk,
pResults[index].pIID,
- (VOID**)&(pResults[index].pItf));
-
+ &xunk2.vptr
+ );
+ pResults[index].pItf = xunk2.punk;
if (pResults[index].hr == S_OK)
successCount++;
}
@@ -1423,7 +1436,7 @@
/*
* Release our temporary unknown pointer.
*/
- IUnknown_Release(pUnk);
+ IUnknown_Release(xunk.punk);
if (successCount == 0)
return E_NOINTERFACE;
Index: dlls/ole32/compobj_private.h
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compobj_private.h,v
retrieving revision 1.6
diff -u -r1.6 compobj_private.h
--- dlls/ole32/compobj_private.h 11 Mar 2003 01:45:39 -0000 1.6
+++ dlls/ole32/compobj_private.h 26 Apr 2003 09:05:38 -0000
@@ -37,10 +37,16 @@
get_facbuf_for_iid(REFIID riid,IPSFactoryBuffer **facbuf) {
HRESULT hres;
CLSID pxclsid;
+ union {
+ LPVOID vptr;
+ IPSFactoryBuffer *psfac;
+ } x;
if ((hres = CoGetPSClsid(riid,&pxclsid)))
return hres;
- return CoGetClassObject(&pxclsid,CLSCTX_INPROC_SERVER,NULL,&IID_IPSFactoryBuffer,(LPVOID*)facbuf);
+ hres = CoGetClassObject(&pxclsid,CLSCTX_INPROC_SERVER,NULL,&IID_IPSFactoryBuffer,&x.vptr);
+ *facbuf = x.psfac;
+ return hres;
}
#define PIPEPREF "\\\\.\\pipe\\"
Index: dlls/ole32/compositemoniker.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compositemoniker.c,v
retrieving revision 1.20
diff -u -r1.20 compositemoniker.c
--- dlls/ole32/compositemoniker.c 10 Apr 2003 18:17:35 -0000 1.20
+++ dlls/ole32/compositemoniker.c 26 Apr 2003 09:05:38 -0000
@@ -1626,7 +1626,7 @@
IEnumMoniker ** ppmk)
{
EnumMonikerImpl* newEnumMoniker;
- int i;
+ unsigned int i;
newEnumMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(EnumMonikerImpl));
Index: dlls/ole32/datacache.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/datacache.c,v
retrieving revision 1.17
diff -u -r1.17 datacache.c
--- dlls/ole32/datacache.c 7 Jan 2003 20:36:28 -0000 1.17
+++ dlls/ole32/datacache.c 26 Apr 2003 09:05:39 -0000
@@ -1070,7 +1070,6 @@
{
HRESULT hr = 0;
HRESULT hrRet = E_UNEXPECTED;
- IPersistStorage *pPersistStorage = 0;
IStorage *pStorage = 0;
IStream *pStream = 0;
OLECHAR name[]={ 2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0};
@@ -1079,12 +1078,16 @@
PresentationDataHeader pdh;
METAFILEPICT *mfPict;
HMETAFILE hMetaFile = 0;
+ union {
+ LPVOID vptr;
+ IPersistStorage *ppers;
+ } xps;
if (pformatetcIn->cfFormat == CF_METAFILEPICT)
{
/* Get the Persist Storage */
- hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)&pPersistStorage);
+ hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, &xps.vptr);
if (hr != S_OK)
goto cleanup;
@@ -1098,7 +1101,7 @@
/* Save it to storage */
- hr = OleSave(pPersistStorage, pStorage, FALSE);
+ hr = OleSave(xps.ppers, pStorage, FALSE);
if (hr != S_OK)
goto cleanup;
@@ -1151,8 +1154,8 @@
if (pStorage)
IStorage_Release(pStorage);
- if (pPersistStorage)
- IPersistStorage_Release(pPersistStorage);
+ if (xps.ppers)
+ IPersistStorage_Release(xps.ppers);
return hrRet;
}
@@ -1208,20 +1211,19 @@
STGMEDIUM* pmedium,
BOOL fRelease)
{
- IOleCache2* oleCache = NULL;
HRESULT hres;
+ union {
+ LPVOID vptr;
+ IOleCache2 *poc;
+ } xoc;
TRACE("(%p, %p, %p, %d)\n", iface, pformatetc, pmedium, fRelease);
- hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, (void**)&oleCache);
-
+ hres = IDataObject_QueryInterface(iface, &IID_IOleCache2, &xoc.vptr);
if (FAILED(hres))
return E_UNEXPECTED;
-
- hres = IOleCache2_SetData(oleCache, pformatetc, pmedium, fRelease);
-
- IOleCache2_Release(oleCache);
-
+ hres = IOleCache2_SetData(xoc.poc, pformatetc, pmedium, fRelease);
+ IOleCache2_Release(xoc.poc);
return hres;
}
Index: dlls/ole32/defaulthandler.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/defaulthandler.c,v
retrieving revision 1.10
diff -u -r1.10 defaulthandler.c
--- dlls/ole32/defaulthandler.c 31 May 2002 23:25:50 -0000 1.10
+++ dlls/ole32/defaulthandler.c 26 Apr 2003 09:05:39 -0000
@@ -1094,14 +1094,17 @@
SIZEL* psizel)
{
DVTARGETDEVICE* targetDevice;
- IViewObject2* cacheView = NULL;
HRESULT hres;
+ union {
+ IViewObject2* pcv;
+ LPVOID vptr;
+ } xvo;
_ICOM_THIS_From_IOleObject(DefaultHandler, iface);
TRACE("(%p, %lx, %p)\n", iface, dwDrawAspect, psizel);
- hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, (void**)&cacheView);
+ hres = IUnknown_QueryInterface(this->dataCache, &IID_IViewObject2, &xvo.vptr);
if (FAILED(hres))
return E_UNEXPECTED;
@@ -1115,18 +1118,12 @@
* extra work until later.
*/
targetDevice = NULL;
-
- hres = IViewObject2_GetExtent(cacheView,
+ hres = IViewObject2_GetExtent(xvo.pcv,
dwDrawAspect,
-1,
targetDevice,
psizel);
-
- /*
- * Cleanup
- */
- IViewObject2_Release(cacheView);
-
+ IViewObject2_Release(xvo.pcv);
return hres;
}
@@ -1326,26 +1323,21 @@
LPFORMATETC pformatetcIn,
STGMEDIUM* pmedium)
{
- IDataObject* cacheDataObject = NULL;
HRESULT hres;
-
+ union {
+ LPVOID vptr;
+ IDataObject *pdo;
+ } xdo;
_ICOM_THIS_From_IDataObject(DefaultHandler, iface);
TRACE("(%p, %p, %p)\n", iface, pformatetcIn, pmedium);
-
- hres = IUnknown_QueryInterface(this->dataCache,
- &IID_IDataObject,
- (void**)&cacheDataObject);
-
+ hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, &xdo.vptr);
if (FAILED(hres))
return E_UNEXPECTED;
-
- hres = IDataObject_GetData(cacheDataObject,
+ hres = IDataObject_GetData(xdo.pdo,
pformatetcIn,
pmedium);
-
- IDataObject_Release(cacheDataObject);
-
+ IDataObject_Release(xdo.pdo);
return hres;
}
@@ -1370,25 +1362,19 @@
IDataObject* iface,
LPFORMATETC pformatetc)
{
- IDataObject* cacheDataObject = NULL;
HRESULT hres;
-
+ union {
+ LPVOID vptr;
+ IDataObject* pdo;
+ } xdo;
_ICOM_THIS_From_IDataObject(DefaultHandler, iface);
TRACE("(%p, %p)\n", iface, pformatetc);
-
- hres = IUnknown_QueryInterface(this->dataCache,
- &IID_IDataObject,
- (void**)&cacheDataObject);
-
+ hres = IUnknown_QueryInterface(this->dataCache, &IID_IDataObject, &xdo.vptr);
if (FAILED(hres))
return E_UNEXPECTED;
-
- hres = IDataObject_QueryGetData(cacheDataObject,
- pformatetc);
-
- IDataObject_Release(cacheDataObject);
-
+ hres = IDataObject_QueryGetData(xdo.pdo, pformatetc);
+ IDataObject_Release(xdo.pdo);
return hres;
}
@@ -1423,27 +1409,24 @@
STGMEDIUM* pmedium,
BOOL fRelease)
{
- IDataObject* cacheDataObject = NULL;
HRESULT hres;
-
+ union {
+ LPVOID vptr;
+ IDataObject *pod;
+ } xdo;
_ICOM_THIS_From_IDataObject(DefaultHandler, iface);
TRACE("(%p, %p, %p, %d)\n", iface, pformatetc, pmedium, fRelease);
-
hres = IUnknown_QueryInterface(this->dataCache,
&IID_IDataObject,
- (void**)&cacheDataObject);
-
+ &xdo.vptr);
if (FAILED(hres))
return E_UNEXPECTED;
-
- hres = IDataObject_SetData(cacheDataObject,
+ hres = IDataObject_SetData(xdo.pod,
pformatetc,
pmedium,
fRelease);
-
- IDataObject_Release(cacheDataObject);
-
+ IDataObject_Release(xdo.pod);
return hres;
}
Index: dlls/ole32/filemoniker.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/filemoniker.c,v
retrieving revision 1.23
diff -u -r1.23 filemoniker.c
--- dlls/ole32/filemoniker.c 7 Jan 2003 20:36:27 -0000 1.23
+++ dlls/ole32/filemoniker.c 26 Apr 2003 09:05:40 -0000
@@ -561,11 +561,19 @@
CLSID clsID;
IUnknown* pObj=0;
IRunningObjectTable *prot=0;
- IPersistFile *ppf=0;
- IClassFactory *pcf=0;
- IClassActivator *pca=0;
-
ICOM_THIS(FileMonikerImpl,iface);
+ union {
+ LPVOID vptr;
+ IPersistFile *ppf;
+ } xpf;
+ union {
+ LPVOID vptr;
+ IClassFactory *pcf;
+ } xcf;
+ union {
+ LPVOID vptr;
+ IClassActivator *pca;
+ } xca;
*ppvResult=0;
@@ -583,44 +591,37 @@
/* first activation of this class */
res=GetClassFile(This->filePathName,&clsID);
if (SUCCEEDED(res)){
-
- res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)&ppf);
+ res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,&xpf.vptr);
if (SUCCEEDED(res)){
- res=IPersistFile_Load(ppf,This->filePathName,STGM_READ);
+ res=IPersistFile_Load(xpf.ppf,This->filePathName,STGM_READ);
if (SUCCEEDED(res)){
-
- pObj=(IUnknown*)ppf;
+ pObj=(IUnknown*)xpf.ppf;
IUnknown_AddRef(pObj);
}
}
}
}
}
- }
- else{
- res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)&pcf);
-
+ } else{
+ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,&xcf.vptr);
if (res==E_NOINTERFACE){
-
- res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)&pca);
-
+ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,&xca.vptr);
if (res==E_NOINTERFACE)
return MK_E_INTERMEDIATEINTERFACENOTSUPPORTED;
}
- if (pcf!=NULL){
-
- IClassFactory_CreateInstance(pcf,NULL,&IID_IPersistFile,(void**)ppf);
+ if (xcf.pcf!=NULL){
- res=IPersistFile_Load(ppf,This->filePathName,STGM_READ);
+ IClassFactory_CreateInstance(xcf.pcf,NULL,&IID_IPersistFile,&xpf.ppf);
+ res=IPersistFile_Load(xpf.ppf,This->filePathName,STGM_READ);
if (SUCCEEDED(res)){
- pObj=(IUnknown*)ppf;
+ pObj=(IUnknown*)xpf.ppf;
IUnknown_AddRef(pObj);
}
}
- if (pca!=NULL){
+ if (xca.pca!=NULL){
FIXME("()\n");
@@ -628,7 +629,7 @@
if (SUCCEEDED(res)){
- res=IClassActivator_GetClassObject(pca,&clsID,CLSCTX_ALL,0,&IID_IPersistFile,(void**)&ppf);
+ res=IClassActivator_GetClassObject(xca.pca,&clsID,CLSCTX_ALL,0,&IID_IPersistFile,&xpf.vptr);
if (SUCCEEDED(res)){
@@ -651,14 +652,14 @@
if (prot!=NULL)
IRunningObjectTable_Release(prot);
- if (ppf!=NULL)
- IPersistFile_Release(ppf);
+ if (xpf.ppf!=NULL)
+ IPersistFile_Release(xpf.ppf);
- if (pca!=NULL)
- IClassActivator_Release(pca);
+ if (xca.pca!=NULL)
+ IClassActivator_Release(xca.pca);
- if (pcf!=NULL)
- IClassFactory_Release(pcf);
+ if (xcf.pcf!=NULL)
+ IClassFactory_Release(xcf.pcf);
return res;
}
Index: dlls/ole32/itemmoniker.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/itemmoniker.c,v
retrieving revision 1.17
diff -u -r1.17 itemmoniker.c
--- dlls/ole32/itemmoniker.c 7 Jan 2003 20:36:27 -0000 1.17
+++ dlls/ole32/itemmoniker.c 26 Apr 2003 09:05:41 -0000
@@ -436,30 +436,23 @@
VOID** ppvResult)
{
ICOM_THIS(ItemMonikerImpl,iface);
-
HRESULT res;
- IID refid=IID_IOleItemContainer;
- IOleItemContainer *poic=0;
+ union {
+ LPVOID vptr;
+ IOleItemContainer *poic;
+ } xoic;
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
- if(ppvResult ==NULL)
- return E_POINTER;
-
- if(pmkToLeft==NULL)
- return E_INVALIDARG;
+ if(ppvResult == NULL) return E_POINTER;
+ if(pmkToLeft == NULL) return E_INVALIDARG;
*ppvResult=0;
-
- res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic);
-
+ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,&xoic.vptr);
if (SUCCEEDED(res)){
-
- res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,riid,ppvResult);
-
- IOleItemContainer_Release(poic);
+ res=IOleItemContainer_GetObject(xoic.poic,This->itemName,BINDSPEED_MODERATE,pbc,riid,ppvResult);
+ IOleItemContainer_Release(xoic.poic);
}
-
return res;
}
@@ -475,24 +468,22 @@
ICOM_THIS(ItemMonikerImpl,iface);
HRESULT res;
- IOleItemContainer *poic=0;
+ union {
+ LPVOID vptr;
+ IOleItemContainer *poic;
+ } xoic;
TRACE("(%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,riid,ppvResult);
*ppvResult=0;
-
if(pmkToLeft==NULL)
return E_INVALIDARG;
-
- res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic);
-
+ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,&xoic.vptr);
if (SUCCEEDED(res)){
+ res=IOleItemContainer_GetObjectStorage(xoic.poic,This->itemName,pbc,riid,ppvResult);
- res=IOleItemContainer_GetObjectStorage(poic,This->itemName,pbc,riid,ppvResult);
-
- IOleItemContainer_Release(poic);
+ IOleItemContainer_Release(xoic.poic);
}
-
return res;
}
@@ -683,7 +674,6 @@
{
IRunningObjectTable* rot;
HRESULT res;
- IOleItemContainer *poic=0;
ICOM_THIS(ItemMonikerImpl,iface);
TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pmkNewlyRunning);
@@ -705,23 +695,21 @@
res = IRunningObjectTable_IsRunning(rot,iface);
IRunningObjectTable_Release(rot);
- }
- else{
+ } else{
+ union {
+ IOleItemContainer *poic;
+ LPVOID vptr;
+ } xoic;
/* If pmkToLeft is non-NULL, the method calls IMoniker::BindToObject on the pmkToLeft parameter, */
/* 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**)&poic);
-
+ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,&xoic.vptr);
if (SUCCEEDED(res)){
-
- res=IOleItemContainer_IsRunning(poic,This->itemName);
-
- IOleItemContainer_Release(poic);
+ res=IOleItemContainer_IsRunning(xoic.poic,This->itemName);
+ IOleItemContainer_Release(xoic.poic);
}
}
-
return res;
}
@@ -858,34 +846,32 @@
ULONG* pchEaten,
IMoniker** ppmkOut)
{
- IOleItemContainer* poic=0;
- IParseDisplayName* ppdn=0;
LPOLESTR displayName;
HRESULT res;
ICOM_THIS(ItemMonikerImpl,iface);
+ union {
+ LPVOID vptr;
+ IOleItemContainer* poic;
+ } xoic;
+ union {
+ LPVOID vptr;
+ IParseDisplayName* ppdn;
+ } xpdn;
/* If pmkToLeft is NULL, this method returns MK_E_SYNTAX */
if (pmkToLeft==NULL)
-
return MK_E_SYNTAX;
- else{
- /* 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**)&poic);
-
- if (SUCCEEDED(res)){
-
- res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)&ppdn);
-
- res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName);
-
- res=IParseDisplayName_ParseDisplayName(ppdn,pbc,displayName,pchEaten,ppmkOut);
-
- IOleItemContainer_Release(poic);
- IParseDisplayName_Release(ppdn);
- }
+ /* 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,&xoic.vptr);
+ if (SUCCEEDED(res)){
+ res=IOleItemContainer_GetObject(xoic.poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,&xpdn.vptr);
+ res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName);
+ res=IParseDisplayName_ParseDisplayName(xpdn.ppdn,pbc,displayName,pchEaten,ppmkOut);
+ IOleItemContainer_Release(xoic.poic);
+ IParseDisplayName_Release(xpdn.ppdn);
}
return res;
}
Index: dlls/ole32/marshal.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/marshal.c,v
retrieving revision 1.8
diff -u -r1.8 marshal.c
--- dlls/ole32/marshal.c 11 Mar 2003 01:45:38 -0000 1.8
+++ dlls/ole32/marshal.c 26 Apr 2003 09:05:41 -0000
@@ -246,17 +246,20 @@
) {
wine_marshal_id mid;
wine_marshal_data md;
- IUnknown *pUnk;
ULONG res;
HRESULT hres;
IRpcStubBuffer *stub;
IPSFactoryBuffer *psfacbuf;
+ union {
+ LPVOID vptr;
+ LPUNKNOWN punk;
+ } xunk;
TRACE("(...,%s,...)\n",debugstr_guid(riid));
- IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk);
+ IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,&xunk.vptr);
mid.processid = GetCurrentProcessId();
- mid.objectid = (DWORD)pUnk; /* FIXME */
- IUnknown_Release(pUnk);
+ mid.objectid = (DWORD)xunk.punk; /* FIXME */
+ IUnknown_Release(xunk.punk);
memcpy(&mid.iid,riid,sizeof(mid.iid));
md.dwDestContext = dwDestContext;
md.mshlflags = mshlflags;
@@ -265,8 +268,8 @@
hres = IStream_Write(pStm,&md,sizeof(md),&res);
if (hres) return hres;
- if (SUCCEEDED(MARSHAL_Find_Stub(&mid,&pUnk))) {
- IUnknown_Release(pUnk);
+ if (SUCCEEDED(MARSHAL_Find_Stub(&mid,&xunk.punk))) {
+ IUnknown_Release(xunk.punk);
return S_OK;
}
hres = get_facbuf_for_iid(riid,&psfacbuf);
@@ -277,9 +280,9 @@
FIXME("Failed to create a stub for %s\n",debugstr_guid(riid));
return hres;
}
- IUnknown_QueryInterface((LPUNKNOWN)pv,riid,(LPVOID*)&pUnk);
- MARSHAL_Register_Stub(&mid,pUnk,stub);
- IUnknown_Release(pUnk);
+ IUnknown_QueryInterface((LPUNKNOWN)pv,riid,&xunk.vptr);
+ MARSHAL_Register_Stub(&mid,xunk.punk,stub);
+ IUnknown_Release(xunk.punk);
return S_OK;
}
@@ -437,16 +440,19 @@
wine_marshal_id mid;
wine_marshal_data md;
ULONG res;
- IUnknown *pUnknown;
+ union {
+ LPVOID vptr;
+ LPUNKNOWN punk;
+ } xunk;
TRACE("(%p, %s, %p, %lx, %p, %lx)\n",
pStm,debugstr_guid(riid),pUnk,dwDestContext,pvDestContext,mshlflags
);
STUBMGR_Start(); /* Just to be sure we have one running. */
mid.processid = GetCurrentProcessId();
- IUnknown_QueryInterface(pUnk,&IID_IUnknown,(LPVOID*)&pUnknown);
- mid.objectid = (DWORD)pUnknown;
- IUnknown_Release(pUnknown);
+ IUnknown_QueryInterface(pUnk,&IID_IUnknown,&xunk.vptr);
+ mid.objectid = (DWORD)xunk.punk;
+ IUnknown_Release(xunk.punk);
memcpy(&mid.iid,riid,sizeof(mid.iid));
md.dwDestContext = dwDestContext;
md.mshlflags = mshlflags;
@@ -499,8 +505,11 @@
wine_marshal_data md;
ULONG res;
LPMARSHAL pMarshal;
- LPUNKNOWN pUnk;
CLSID xclsid;
+ union {
+ LPVOID vptr;
+ LPUNKNOWN punk;
+ } xunk;
TRACE("(%p,%s,%p)\n",pStm,debugstr_guid(riid),ppv);
@@ -519,12 +528,12 @@
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**)&pUnk);
+ hres=CoCreateInstance(&xclsid,NULL,CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,&IID_IMarshal,&xunk.vptr);
if (hres) {
FIXME("Failed to create instance of unmarshaller %s.\n",debugstr_guid(&xclsid));
return hres;
}
- hres = _GetMarshaller(riid,pUnk,md.dwDestContext,NULL,md.mshlflags,&pMarshal);
+ hres = _GetMarshaller(riid,xunk.punk,md.dwDestContext,NULL,md.mshlflags,&pMarshal);
if (hres) {
FIXME("Failed to get unmarshaller, %lx?\n",hres);
return hres;
Index: dlls/ole32/moniker.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/moniker.c,v
retrieving revision 1.22
diff -u -r1.22 moniker.c
--- dlls/ole32/moniker.c 10 Apr 2003 18:17:35 -0000 1.22
+++ dlls/ole32/moniker.c 26 Apr 2003 09:05:42 -0000
@@ -498,15 +498,18 @@
*/
HRESULT WINAPI OleRun(LPUNKNOWN pUnknown)
{
- IRunnableObject *runable;
ICOM_THIS(IRunnableObject,pUnknown);
LRESULT ret;
+ union {
+ LPVOID vptr;
+ IRunnableObject *runable;
+ } xro;
- ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,(LPVOID*)&runable);
+ ret = IRunnableObject_QueryInterface(This,&IID_IRunnableObject,&xro.vptr);
if (ret)
return 0; /* Appears to return no error. */
- ret = IRunnableObject_Run(runable,NULL);
- IRunnableObject_Release(runable);
+ ret = IRunnableObject_Run(xro.runable,NULL);
+ IRunnableObject_Release(xro.runable);
return ret;
}
Index: dlls/ole32/ole2.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole2.c,v
retrieving revision 1.42
diff -u -r1.42 ole2.c
--- dlls/ole32/ole2.c 28 Jan 2003 01:06:20 -0000 1.42
+++ dlls/ole32/ole2.c 26 Apr 2003 09:05:43 -0000
@@ -718,24 +718,22 @@
LPUNKNOWN pUnknown,
BOOL fContained)
{
- IRunnableObject* runnable = NULL;
HRESULT hres;
+ union {
+ LPVOID vptr;
+ IRunnableObject* runnable;
+ } xro;
TRACE("(%p,%x), stub!\n", pUnknown, fContained);
-
hres = IUnknown_QueryInterface(pUnknown,
&IID_IRunnableObject,
- (void**)&runnable);
-
+ &xro.vptr);
if (SUCCEEDED(hres))
{
- hres = IRunnableObject_SetContainedObject(runnable, fContained);
-
- IRunnableObject_Release(runnable);
-
+ hres = IRunnableObject_SetContainedObject(xro.runnable, fContained);
+ IRunnableObject_Release(xro.runnable);
return hres;
}
-
return S_OK;
}
@@ -748,10 +746,16 @@
LPOLECLIENTSITE pClientSite,
LPVOID* ppvObj)
{
- IPersistStorage* persistStorage = NULL;
- IOleObject* oleObject = NULL;
STATSTG storageInfo;
HRESULT hres;
+ union {
+ LPVOID vptr;
+ IPersistStorage* persistStorage;
+ } xps;
+ union {
+ LPVOID vptr;
+ IOleObject* oleObject;
+ } xoo;
TRACE("(%p,%p,%p,%p)\n", pStg, riid, pClientSite, ppvObj);
@@ -771,7 +775,7 @@
NULL,
CLSCTX_INPROC_HANDLER,
&IID_IOleObject,
- (void**)&oleObject);
+ &xoo.vptr);
/*
* If that fails, as it will most times, load the default
@@ -782,7 +786,7 @@
hres = OleCreateDefaultHandler(&storageInfo.clsid,
NULL,
&IID_IOleObject,
- (void**)&oleObject);
+ &xoo.vptr);
}
/*
@@ -794,33 +798,23 @@
/*
* Inform the new object of it's client site.
*/
- hres = IOleObject_SetClientSite(oleObject, pClientSite);
+ hres = IOleObject_SetClientSite(xoo.oleObject, pClientSite);
/*
* Initialize the object with it's IPersistStorage interface.
*/
- hres = IOleObject_QueryInterface(oleObject,
+ hres = IOleObject_QueryInterface(xoo.oleObject,
&IID_IPersistStorage,
- (void**)&persistStorage);
+ &xps.vptr);
if (SUCCEEDED(hres))
{
- IPersistStorage_Load(persistStorage, pStg);
-
- IPersistStorage_Release(persistStorage);
- persistStorage = NULL;
+ IPersistStorage_Load(xps.persistStorage, pStg);
+ IPersistStorage_Release(xps.persistStorage);
+ xps.persistStorage = NULL;
}
-
- /*
- * Return the requested interface to the caller.
- */
- hres = IOleObject_QueryInterface(oleObject, riid, ppvObj);
-
- /*
- * Cleanup interfaces used internally
- */
- IOleObject_Release(oleObject);
-
+ hres = IOleObject_QueryInterface(xoo.oleObject, riid, ppvObj);
+ IOleObject_Release(xoo.oleObject);
return hres;
}
@@ -868,27 +862,26 @@
*/
HRESULT WINAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCloses)
{
- IRunnableObject* runnable = NULL;
HRESULT hres;
+ union {
+ LPVOID vptr;
+ IRunnableObject* runnable;
+ } xro;
TRACE("(%p,%x,%x)\n", pUnknown, fLock, fLastUnlockCloses);
hres = IUnknown_QueryInterface(pUnknown,
&IID_IRunnableObject,
- (void**)&runnable);
+ &xro.vptr);
if (SUCCEEDED(hres))
{
- hres = IRunnableObject_LockRunning(runnable, fLock, fLastUnlockCloses);
-
- IRunnableObject_Release(runnable);
-
+ hres = IRunnableObject_LockRunning(xro.runnable, fLock, fLastUnlockCloses);
+ IRunnableObject_Release(xro.runnable);
return hres;
}
- else
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
-
/**************************************************************************
* Internal methods to manage the shared OLE menu in response to the
Index: dlls/ole32/ole2impl.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole2impl.c,v
retrieving revision 1.7
diff -u -r1.7 ole2impl.c
--- dlls/ole32/ole2impl.c 7 Jan 2003 20:36:27 -0000 1.7
+++ dlls/ole32/ole2impl.c 26 Apr 2003 09:05:43 -0000
@@ -128,9 +128,15 @@
{
ILockBytes *ptrILockBytes = 0;
IStorage *pStorage = 0;
- IOleObject *pOleObject = 0;
- IPersistStorage *pPersistStorage = 0;
CLSID clsID;
+ union {
+ LPVOID vptr;
+ IPersistStorage *pPersistStorage;
+ } xps;
+ union {
+ LPVOID vptr;
+ IOleObject *pOleObject;
+ } xoe;
/* Create ILock bytes */
@@ -149,30 +155,30 @@
/* Create default handler for Persist storage */
if (hr1 == S_OK)
- hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, (LPVOID*)&pPersistStorage);
+ hr1 = OleCreateDefaultHandler(&clsID, NULL, &IID_IPersistStorage, &xps.vptr);
/* Load the storage to Persist storage */
if (hr1 == S_OK)
- hr1 = IPersistStorage_Load(pPersistStorage, pStorage);
+ hr1 = IPersistStorage_Load(xps.pPersistStorage, pStorage);
/* Query for IOleObject */
if (hr1 == S_OK)
- hr1 = IPersistStorage_QueryInterface(pPersistStorage, &IID_IOleObject, (LPVOID*)&pOleObject);
+ hr1 = IPersistStorage_QueryInterface(xps.pPersistStorage, &IID_IOleObject, &xoe.vptr);
/* Set client site with the IOleObject */
if (hr1 == S_OK)
- hr1 = IOleObject_SetClientSite(pOleObject, pClientSite);
+ hr1 = IOleObject_SetClientSite(xoe.pOleObject, pClientSite);
- IPersistStorage_Release(pPersistStorage);
+ IPersistStorage_Release(xps.pPersistStorage);
/* Query for the requested interface */
if (hr1 == S_OK)
- hr1 = IPersistStorage_QueryInterface(pPersistStorage, riid, ppvObj);
+ hr1 = IPersistStorage_QueryInterface(xps.pPersistStorage, riid, ppvObj);
- IPersistStorage_Release(pPersistStorage);
+ IPersistStorage_Release(xps.pPersistStorage);
IStorage_Release(pStorage);
Index: dlls/ole32/ole2stubs.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole2stubs.c,v
retrieving revision 1.29
diff -u -r1.29 ole2stubs.c
--- dlls/ole32/ole2stubs.c 13 Jan 2003 20:37:39 -0000 1.29
+++ dlls/ole32/ole2stubs.c 26 Apr 2003 09:05:43 -0000
@@ -96,36 +96,44 @@
LPVOID* ppvObj)
{
HRESULT hres, hres1;
- IUnknown * pUnk = NULL;
+ union {
+ IUnknown * pUnk;
+ LPVOID vptr;
+ } xunk;
FIXME("\n\t%s\n\t%s 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*)&pUnk))))
+ if (SUCCEEDED((hres = CoCreateInstance(rclsid, 0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER , riid, &xunk.vptr))))
{
if (pClientSite)
{
- IOleObject * pOE;
- IPersistStorage * pPS;
- if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IOleObject, (LPVOID*)&pOE))))
+ union {
+ LPVOID vptr;
+ IOleObject * pOE;
+ } xoo;
+ union {
+ LPVOID vptr;
+ IPersistStorage * pPS;
+ } xps;
+
+ if (SUCCEEDED((hres = IUnknown_QueryInterface( xunk.pUnk, &IID_IOleObject, &xoo.vptr))))
{
TRACE("trying to set clientsite %p\n", pClientSite);
- hres1 = IOleObject_SetClientSite(pOE, pClientSite);
+ hres1 = IOleObject_SetClientSite(xoo.pOE, pClientSite);
TRACE("-- result 0x%08lx\n", hres1);
- IOleObject_Release(pOE);
+ IOleObject_Release(xoo.pOE);
}
- if (SUCCEEDED((hres = IUnknown_QueryInterface( pUnk, &IID_IPersistStorage, (LPVOID*)&pPS))))
+ if (SUCCEEDED((hres = IUnknown_QueryInterface( xunk.pUnk, &IID_IPersistStorage, &xps.vptr))))
{
TRACE("trying to set stg %p\n", pStg);
- hres1 = IPersistStorage_InitNew(pPS, pStg);
+ hres1 = IPersistStorage_InitNew(xps.pPS, pStg);
TRACE("-- result 0x%08lx\n", hres1);
- IPersistStorage_Release(pPS);
+ IPersistStorage_Release(xps.pPS);
}
}
}
-
- *ppvObj = pUnk;
-
- TRACE("-- %p \n", pUnk);
+ *ppvObj = xunk.vptr;
+ TRACE("-- %p \n", xunk.pUnk);
return hres;
}
Index: dlls/ole32/oleproxy.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/oleproxy.c,v
retrieving revision 1.6
diff -u -r1.6 oleproxy.c
--- dlls/ole32/oleproxy.c 7 Jan 2003 20:36:27 -0000 1.6
+++ dlls/ole32/oleproxy.c 26 Apr 2003 09:05:44 -0000
@@ -138,13 +138,19 @@
if (msg->iMethod == 3) { /* CreateInstance */
IID iid;
- IClassFactory *classfac;
- IUnknown *ppv;
IStream *pStm;
STATSTG ststg;
ULARGE_INTEGER newpos;
LARGE_INTEGER seekto;
ULONG res;
+ union {
+ LPVOID vptr;
+ IClassFactory *classfac;
+ } xcf;
+ union {
+ LPVOID vptr;
+ IUnknown *ppv;
+ } xunk;
if (msg->cbBuffer < sizeof(IID)) {
FIXME("Not enough bytes in buffer (%ld instead of %d)?\n",msg->cbBuffer,sizeof(IID));
@@ -152,13 +158,13 @@
}
memcpy(&iid,msg->Buffer,sizeof(iid));
TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid));
- hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac);
+ hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,&xcf.vptr);
if (hres) {
FIXME("Ole server does not provide a IClassFactory?\n");
return hres;
}
- hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv);
- IClassFactory_Release(classfac);
+ hres = IClassFactory_CreateInstance(xcf.classfac,NULL,&iid,&xunk.vptr);
+ IClassFactory_Release(xcf.classfac);
if (hres) {
msg->cbBuffer = 0;
FIXME("Failed to create an instance of %s\n",debugstr_guid(&iid));
@@ -169,7 +175,7 @@
FIXME("Failed to create stream on hglobal\n");
return hres;
}
- hres = CoMarshalInterface(pStm,&iid,ppv,0,NULL,0);
+ hres = CoMarshalInterface(pStm,&iid,xunk.ppv,0,NULL,0);
if (hres) {
FIXME("CoMarshalInterface failed, %lx!\n",hres);
msg->cbBuffer = 0;
Index: dlls/ole32/storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/storage32.c,v
retrieving revision 1.37
diff -u -r1.37 storage32.c
--- dlls/ole32/storage32.c 10 Apr 2003 18:17:35 -0000 1.37
+++ dlls/ole32/storage32.c 26 Apr 2003 09:05:48 -0000
@@ -5877,7 +5877,10 @@
{
CLSID clsid;
HRESULT res;
- LPPERSISTSTREAM xstm;
+ union {
+ LPVOID vptr;
+ LPPERSISTSTREAM pstm;
+ } xstm;
TRACE("(%p,%s,%p)\n",pStm,debugstr_guid(iidInterface),ppvObj);
@@ -5887,13 +5890,13 @@
res=CoCreateInstance(&clsid,NULL,CLSCTX_INPROC_SERVER,iidInterface,ppvObj);
if (!SUCCEEDED(res))
return res;
- res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,(LPVOID*)&xstm);
+ res=IUnknown_QueryInterface((IUnknown*)*ppvObj,&IID_IPersistStream,&xstm.vptr);
if (!SUCCEEDED(res)) {
IUnknown_Release((IUnknown*)*ppvObj);
return res;
}
- res=IPersistStream_Load(xstm,pStm);
- IPersistStream_Release(xstm);
+ res=IPersistStream_Load(xstm.pstm,pStm);
+ IPersistStream_Release(xstm.pstm);
/* FIXME: all refcounts ok at this point? I think they should be:
* pStm : unchanged
* ppvObj : 1
More information about the wine-patches
mailing list