Jacek Caban : ole32: Don't fail in OleCreate if created object doesn' t implement IRunnableObject or IOleChache.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 9 06:02:59 CDT 2006


Module: wine
Branch: master
Commit: 2abe8348fa907d201b60e726d774a8ccd21e237f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2abe8348fa907d201b60e726d774a8ccd21e237f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Oct  7 14:56:09 2006 +0200

ole32: Don't fail in OleCreate if created object doesn't implement IRunnableObject or IOleChache.

---

 dlls/ole32/ole2.c       |   17 ++++++----
 dlls/ole32/tests/ole2.c |   79 ++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 70 insertions(+), 26 deletions(-)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index c6df7ed..9779618 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -2378,21 +2378,24 @@ HRESULT WINAPI OleCreate(
     {
         IRunnableObject *pRunnable;
         IOleCache *pOleCache;
+        HRESULT hres2;
 
-        hres = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
-        if (SUCCEEDED(hres))
+        hres2 = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
+        if (SUCCEEDED(hres2))
         {
             hres = IRunnableObject_Run(pRunnable, NULL);
             IRunnableObject_Release(pRunnable);
         }
 
         if (SUCCEEDED(hres))
-            hres = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
-        if (SUCCEEDED(hres))
         {
-            DWORD dwConnection;
-            hres = IOleCache_Cache(pOleCache, pFormatEtc, ADVF_PRIMEFIRST, &dwConnection);
-            IOleCache_Release(pOleCache);
+            hres2 = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
+            if (SUCCEEDED(hres2))
+            {
+                DWORD dwConnection;
+                hres = IOleCache_Cache(pOleCache, pFormatEtc, ADVF_PRIMEFIRST, &dwConnection);
+                IOleCache_Release(pOleCache);
+            }
         }
     }
 
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index c7a3023..fe3a6a2 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -32,8 +32,8 @@ #include "wine/test.h"
 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
 
 static IPersistStorage OleObjectPersistStg;
-static IOleCache OleObjectCache;
-static IRunnableObject OleObjectRunnable;
+static IOleCache *cache;
+static IRunnableObject *runnable;
 
 static char const * const *expected_method_list;
 
@@ -52,33 +52,24 @@ #define CHECK_EXPECTED_METHOD(method_nam
 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
 {
     CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
+
+    *ppv = NULL;
+
     if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
-    {
         *ppv = (void *)iface;
-        IUnknown_AddRef(iface);
-        return S_OK;
-    }
     else if (IsEqualIID(riid, &IID_IPersistStorage))
-    {
         *ppv = &OleObjectPersistStg;
-        IUnknown_AddRef((IUnknown *)*ppv);
-        return S_OK;
-    }
     else if (IsEqualIID(riid, &IID_IOleCache))
-    {
-        *ppv = &OleObjectCache;
-        IUnknown_AddRef((IUnknown *)*ppv);
-        return S_OK;
-    }
+        *ppv = cache;
     else if (IsEqualIID(riid, &IID_IRunnableObject))
-    {
-        *ppv = &OleObjectRunnable;
-        IUnknown_AddRef((IUnknown *)*ppv);
+        *ppv = runnable;
+
+    if(*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
         return S_OK;
     }
 
     trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
-    *ppv = NULL;
     return E_NOINTERFACE;
 }
 
@@ -722,7 +713,41 @@ static void test_OleCreate(IStorage *pSt
         "OleObject_Release",
         NULL
     };
+    static const char *methods_olerender_draw_no_runnable[] =
+    {
+        "OleObject_QueryInterface",
+        "OleObject_AddRef",
+        "OleObject_QueryInterface",
+        "OleObjectPersistStg_AddRef",
+        "OleObjectPersistStg_InitNew",
+        "OleObjectPersistStg_Release",
+        "OleObject_QueryInterface",
+        "OleObject_QueryInterface",
+        "OleObjectCache_AddRef",
+        "OleObjectCache_Cache",
+        "OleObjectCache_Release",
+        "OleObject_Release",
+        NULL
+    };
+    static const char *methods_olerender_draw_no_cache[] =
+    {
+        "OleObject_QueryInterface",
+        "OleObject_AddRef",
+        "OleObject_QueryInterface",
+        "OleObjectPersistStg_AddRef",
+        "OleObjectPersistStg_InitNew",
+        "OleObjectPersistStg_Release",
+        "OleObject_QueryInterface",
+        "OleObjectRunnable_AddRef",
+        "OleObjectRunnable_Run",
+        "OleObjectRunnable_Release",
+        "OleObject_QueryInterface",
+        "OleObject_Release",
+        NULL
+    };
 
+    runnable = &OleObjectRunnable;
+    cache = &OleObjectCache;
     expected_method_list = methods_olerender_none;
     trace("OleCreate with OLERENDER_NONE:\n");
     hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
@@ -756,6 +781,22 @@ static void test_OleCreate(IStorage *pSt
     IOleObject_Release(pObject);
     ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
 
+    runnable = NULL;
+    expected_method_list = methods_olerender_draw_no_runnable;
+    trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n");
+    hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
+    ok_ole_success(hr, "OleCreate");
+    IOleObject_Release(pObject);
+    ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
+
+    runnable = &OleObjectRunnable;
+    cache = NULL;
+    expected_method_list = methods_olerender_draw_no_cache;
+    trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n");
+    hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
+    ok_ole_success(hr, "OleCreate");
+    IOleObject_Release(pObject);
+    ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
     trace("end\n");
 }
 




More information about the wine-cvs mailing list