/*********************************************************************** * AtlRegisterTypeLib [atl80.18] */ HRESULT WINAPI AtlComModuleRegisterServer(_ATL_COM_MODULE *mod, BOOL bRegTypeLib, const CLSID *clsid) { const struct _ATL_CATMAP_ENTRY *catmap; _ATL_OBJMAP_ENTRY **iter; HRESULT hres; TRACE("(%p %x %s)\n", mod, bRegTypeLib, debugstr_guid(clsid)); for(iter = mod->m_ppAutoObjMapFirst; iter < mod->m_ppAutoObjMapLast; iter++) { if(!*iter || (clsid && !IsEqualCLSID((*iter)->pclsid, clsid))) continue; TRACE("Registering clsid %s\n", debugstr_guid((*iter)->pclsid)); hres = (*iter)->pfnUpdateRegistry(TRUE); if(FAILED(hres)) return hres; catmap = (*iter)->pfnGetCategoryMap(); if(catmap) { hres = AtlRegisterClassCategoriesHelper((*iter)->pclsid, catmap, TRUE); if(FAILED(hres)) return hres; } } if(bRegTypeLib) { hres = AtlRegisterTypeLib(mod->m_hInstTypeLib, NULL); if(FAILED(hres)) return hres; } return S_OK; }
static void test_regcat(void) { unsigned char b; HRESULT hres; const struct _ATL_CATMAP_ENTRY catmap[] = { {_ATL_CATMAP_ENTRY_IMPLEMENTED, &CATID_CatTest1}, {_ATL_CATMAP_ENTRY_REQUIRED, &CATID_CatTest2}, {_ATL_CATMAP_ENTRY_END} }; if (is_process_limited()) { skip("process is limited\n"); return; } hres = AtlRegisterClassCategoriesHelper(&CLSID_Test, catmap, TRUE); ok(hres == S_OK, "AtlRegisterClassCategoriesHelper failed: %08x\n", hres); test_key_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}"); test_key_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}\\Implemented Categories\\{" CATID_CATTEST1_STR "}"); test_key_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}\\Required Categories\\{" CATID_CATTEST2_STR "}"); hres = AtlRegisterClassCategoriesHelper(&CLSID_Test, catmap, FALSE); ok(hres == S_OK, "AtlRegisterClassCategoriesHelper failed: %08x\n", hres); test_key_not_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}\\Implemented Categories"); test_key_not_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}\\Required Categories"); test_key_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}"); ok(RegDeleteKeyA(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}") == ERROR_SUCCESS, "Could not delete key\n"); hres = AtlRegisterClassCategoriesHelper(&CLSID_Test, NULL, TRUE); ok(hres == S_OK, "AtlRegisterClassCategoriesHelper failed: %08x\n", hres); test_key_not_exists(HKEY_CLASSES_ROOT, "CLSID\\{" CLSID_TEST_STR "}"); b = 10; hres = AtlGetPerUserRegistration(&b); ok(hres == S_OK, "AtlGetPerUserRegistration failed: %08x\n", hres); ok(!b, "AtlGetPerUserRegistration returned %x\n", b); }
/*********************************************************************** * 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; }