Robert Shearman : ole32:
Re-order the function calls in OleLoad to match native.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Sep 7 05:07:17 CDT 2006
Module: wine
Branch: master
Commit: 4ad8da53f5946965a1461f38be956ec58a9b0c25
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4ad8da53f5946965a1461f38be956ec58a9b0c25
Author: Robert Shearman <rob at codeweavers.com>
Date: Thu Aug 31 17:17:55 2006 +0100
ole32: Re-order the function calls in OleLoad to match native.
Call IOleObject_GetMiscStatus like OleCreate and native do.
---
dlls/ole32/ole2.c | 50 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index e2d9d9d..8f0629c 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -952,12 +952,15 @@ HRESULT WINAPI OleLoad(
LPVOID* ppvObj)
{
IPersistStorage* persistStorage = NULL;
- IOleObject* oleObject = NULL;
+ IUnknown* pUnk;
+ IOleObject* pOleObject = NULL;
STATSTG storageInfo;
HRESULT hres;
TRACE("(%p,%p,%p,%p)\n", pStg, riid, pClientSite, ppvObj);
+ *ppvObj = NULL;
+
/*
* TODO, Conversion ... OleDoAutoConvert
*/
@@ -973,8 +976,8 @@ HRESULT WINAPI OleLoad(
hres = CoCreateInstance(&storageInfo.clsid,
NULL,
CLSCTX_INPROC_HANDLER,
- &IID_IOleObject,
- (void**)&oleObject);
+ riid,
+ (void**)&pUnk);
/*
* If that fails, as it will most times, load the default
@@ -984,8 +987,8 @@ HRESULT WINAPI OleLoad(
{
hres = OleCreateDefaultHandler(&storageInfo.clsid,
NULL,
- &IID_IOleObject,
- (void**)&oleObject);
+ riid,
+ (void**)&pUnk);
}
/*
@@ -994,35 +997,50 @@ HRESULT WINAPI OleLoad(
if (FAILED(hres))
return hres;
- /*
- * Inform the new object of it's client site.
- */
- hres = IOleObject_SetClientSite(oleObject, pClientSite);
+ if (pClientSite)
+ {
+ hres = IUnknown_QueryInterface(pUnk, &IID_IOleObject, (void **)&pOleObject);
+ if (SUCCEEDED(hres))
+ {
+ DWORD dwStatus;
+ hres = IOleObject_GetMiscStatus(pOleObject, DVASPECT_CONTENT, &dwStatus);
+ }
+ }
/*
* Initialize the object with it's IPersistStorage interface.
*/
- hres = IOleObject_QueryInterface(oleObject,
+ hres = IOleObject_QueryInterface(pUnk,
&IID_IPersistStorage,
(void**)&persistStorage);
if (SUCCEEDED(hres))
{
- IPersistStorage_Load(persistStorage, pStg);
+ hres = IPersistStorage_Load(persistStorage, pStg);
IPersistStorage_Release(persistStorage);
persistStorage = NULL;
}
- /*
- * Return the requested interface to the caller.
- */
- hres = IOleObject_QueryInterface(oleObject, riid, ppvObj);
+ if (SUCCEEDED(hres) && pClientSite)
+ /*
+ * Inform the new object of it's client site.
+ */
+ hres = IOleObject_SetClientSite(pOleObject, pClientSite);
/*
* Cleanup interfaces used internally
*/
- IOleObject_Release(oleObject);
+ if (pOleObject)
+ IOleObject_Release(pOleObject);
+
+ if (FAILED(hres))
+ {
+ IUnknown_Release(pUnk);
+ pUnk = NULL;
+ }
+
+ *ppvObj = pUnk;
return hres;
}
More information about the wine-cvs
mailing list