/************************************************************************* * DllGetClassObject [SHELL32.@] * SHDllGetClassObject [SHELL32.128] */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) { HRESULT hres = E_OUTOFMEMORY; IClassFactory * pcf = NULL; int i; TRACE("CLSID:%s,IID:%s\n",shdebugstr_guid(rclsid),shdebugstr_guid(iid)); if (!ppv) return E_INVALIDARG; *ppv = NULL; /* search our internal interface table */ for(i=0;InterfaceTable[i].riid;i++) { if(IsEqualIID(InterfaceTable[i].riid, rclsid)) { TRACE("index[%u]\n", i); pcf = IDefClF_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); } } if (!pcf) { FIXME("failed for CLSID=%s\n", shdebugstr_guid(rclsid)); return CLASS_E_CLASSNOTAVAILABLE; } hres = IClassFactory_QueryInterface(pcf, iid, ppv); IClassFactory_Release(pcf); TRACE("-- pointer to class factory: %p\n",*ppv); return hres; }
/****************************************************************************** * SHCreateDefClassObject [SHELL32.70] */ HRESULT WINAPI SHCreateDefClassObject( REFIID riid, LPVOID* ppv, LPFNCREATEINSTANCE lpfnCI, /* [in] create instance callback entry */ LPDWORD pcRefDll, /* [in/out] ref count of the dll */ REFIID riidInst) /* [in] optional interface to the instance */ { IClassFactory * pcf; TRACE("%s %p %p %p %s\n", shdebugstr_guid(riid), ppv, lpfnCI, pcRefDll, shdebugstr_guid(riidInst)); if (! IsEqualCLSID(riid, &IID_IClassFactory) ) return E_NOINTERFACE; if (! (pcf = IDefClF_fnConstructor(lpfnCI, (PLONG)pcRefDll, riidInst))) return E_OUTOFMEMORY; *ppv = pcf; return NOERROR; }
/****************************************************************************** * SHCreateDefClassObject [SHELL32.70] */ HRESULT WINAPI SHCreateDefClassObject( REFIID riid, LPVOID* ppv, LPFNCREATEINSTANCE lpfnCI, /* [in] create instance callback entry */ LPDWORD pcRefDll, /* [in/out] ref count of the dll */ REFIID riidInst) /* [in] optional interface to the instance */ { IClassFactory *pcf; HRESULT hResult; TRACE("%s %p %p %p %s\n", shdebugstr_guid(&riid), ppv, lpfnCI, pcRefDll, shdebugstr_guid(&riidInst)); if (!IsEqualCLSID(riid, IID_IClassFactory)) return E_NOINTERFACE; hResult = IDefClF_fnConstructor(lpfnCI, (PLONG)pcRefDll, &riidInst, &pcf); if (FAILED(hResult)) return hResult; *ppv = pcf; return S_OK; }