Module: wine Branch: master Commit: 72ddcb5f362748c040dc902bb5c1c75760c675b1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=72ddcb5f362748c040dc902bb5... Author: Rob Shearman <rob(a)codeweavers.com> Date: Wed Apr 25 11:21:48 2007 +0100 atl: AtlModuleGetClassObject should store an intermediate pointer in obj->pCF and then query this for the requested interface. Return CLASS_E_CLASSNOTAVAILABLE instead of E_FAIL. --- dlls/atl/atl_main.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) 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(_ATL_MODULEW *pm, REFCLSID rclsid, 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(_ATL_MODULEW *pm, REFCLSID rclsid, 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; } /***********************************************************************