atl: AtlModuleGetClassObject should store an intermediate pointer in obj->pCF and then query this for the requested interface.

Robert Shearman rob at codeweavers.com
Wed Apr 25 05:21:48 CDT 2007


Return CLASS_E_CLASSNOTAVAILABLE instead of E_FAIL.
---
  dlls/atl/atl_main.c |   13 +++++++++++--
  1 files changed, 11 insertions(+), 2 deletions(-)
-------------- next part --------------
diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c
index a25f747..3b5703e 100644
--- a/dlls/atl/atl_main.c
+++ b/dlls/atl/atl_main.c
@@ -340,6 +340,7 @@ HRESULT WINAPI AtlModuleGetClassObject(_
                                        REFIID riid, LPVOID *ppv)
 {
     int i;
+    HRESULT hres = CLASS_E_CLASSNOTAVAILABLE;
 
     TRACE("%p %s %s %p\n", pm, debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 
@@ -354,13 +355,21 @@ HRESULT WINAPI AtlModuleGetClassObject(_
 
             TRACE("found object %i\n", i);
             if (obj->pfnGetClassObject)
-                return obj->pfnGetClassObject(obj->pfnCreateInstance, riid, ppv);
+            {
+                if (!obj->pCF)
+                    hres = obj->pfnGetClassObject(obj->pfnCreateInstance,
+                                                  &IID_IUnknown,
+                                                  (void **)&obj->pCF);
+                if (obj->pCF)
+                    hres = IUnknown_QueryInterface(obj->pCF, riid, ppv);
+                break;
+            }
         }
     }
 
     WARN("no class object found for %s\n", debugstr_guid(rclsid));
 
-    return E_FAIL;
+    return hres;
 }
 
 /***********************************************************************


More information about the wine-patches mailing list