/*********************************************************************** * AtlModuleGetClassObject [ATL.@] */ HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { _ATL_OBJMAP_ENTRYW_V1 *obj; int i; HRESULT hres = CLASS_E_CLASSNOTAVAILABLE; TRACE("%p %s %s %p\n", pm, debugstr_guid(rclsid), debugstr_guid(riid), ppv); if (pm == NULL) return E_INVALIDARG; for (i = 0; (obj = get_objmap_entry( pm, i )) != NULL; i++) { if (IsEqualCLSID(obj->pclsid, rclsid)) { TRACE("found object %i\n", i); if (obj->pfnGetClassObject) { 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 hres; }
/*********************************************************************** * AtlModuleRegisterServer [ATL.@] * */ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* clsid) { const _ATL_OBJMAP_ENTRYW_V1 *obj; int i; HRESULT hRes; TRACE("%p %d %s\n", pM, bRegTypeLib, debugstr_guid(clsid)); if (pM == NULL) return E_INVALIDARG; for (i = 0; (obj = get_objmap_entry( pM, i )) != NULL; i++) /* register CLSIDs */ { if (!clsid || IsEqualCLSID(obj->pclsid, clsid)) { TRACE("Registering clsid %s\n", debugstr_guid(obj->pclsid)); hRes = obj->pfnUpdateRegistry(TRUE); /* register */ if (FAILED(hRes)) return hRes; } } if (bRegTypeLib) { hRes = AtlRegisterTypeLib(pM->m_hInstTypeLib, NULL); if (FAILED(hRes)) return hRes; } return S_OK; }
/*********************************************************************** * AtlModuleRegisterServer [ATL.@] * */ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* clsid) { const _ATL_OBJMAP_ENTRYW_V1 *obj; int i; HRESULT hRes; TRACE("%p %d %s\n", pM, bRegTypeLib, debugstr_guid(clsid)); if (pM == NULL) return E_INVALIDARG; for (i = 0; (obj = get_objmap_entry( pM, i )) != NULL; i++) /* register CLSIDs */ { if (!clsid || IsEqualCLSID(obj->pclsid, clsid)) { TRACE("Registering clsid %s\n", debugstr_guid(obj->pclsid)); hRes = obj->pfnUpdateRegistry(TRUE); /* register */ if (FAILED(hRes)) return hRes; if(pM->cbSize > ATLVer1Size) { const struct _ATL_CATMAP_ENTRY *catmap; catmap = ((const _ATL_OBJMAP_ENTRYW*)obj)->pfnGetCategoryMap(); if(catmap) { hRes = AtlRegisterClassCategoriesHelper(obj->pclsid, catmap, TRUE); if(FAILED(hRes)) return hRes; } } } } if (bRegTypeLib) { hRes = AtlRegisterTypeLib(pM->m_hInstTypeLib, NULL); if (FAILED(hRes)) return hRes; } return S_OK; }
HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContext, DWORD dwFlags) { _ATL_OBJMAP_ENTRYW_V1 *obj; int i=0; TRACE("(%p %i %i)\n",pM, dwClsContext, dwFlags); if (pM == NULL) return E_INVALIDARG; while ((obj = get_objmap_entry( pM, i++ ))) { IUnknown* pUnknown; HRESULT rc; TRACE("Registering object %i\n",i); if (obj->pfnGetClassObject) { rc = obj->pfnGetClassObject(obj->pfnCreateInstance, &IID_IUnknown, (LPVOID*)&pUnknown); if (SUCCEEDED (rc) ) { rc = CoRegisterClassObject(obj->pclsid, pUnknown, dwClsContext, dwFlags, &obj->dwRegister); if (FAILED (rc) ) WARN("Failed to register object %i: 0x%08x\n", i, rc); if (pUnknown) IUnknown_Release(pUnknown); } } } return S_OK; }