/********************************************************************** * COMCAT_ICatInformation_EnumClassesOfCategories */ static HRESULT WINAPI COMCAT_ICatInformation_EnumClassesOfCategories( LPCATINFORMATION iface, ULONG cImplemented, CATID *rgcatidImpl, ULONG cRequired, CATID *rgcatidReq, LPENUMCLSID *ppenumCLSID) { struct class_categories *categories; TRACE("\n"); if (cImplemented == (ULONG)-1) cImplemented = 0; if (cRequired == (ULONG)-1) cRequired = 0; if (ppenumCLSID == NULL || (cImplemented && rgcatidImpl == NULL) || (cRequired && rgcatidReq == NULL)) return E_POINTER; categories = COMCAT_PrepareClassCategories(cImplemented, rgcatidImpl, cRequired, rgcatidReq); if (categories == NULL) return E_OUTOFMEMORY; *ppenumCLSID = COMCAT_CLSID_IEnumGUID_Construct(categories); if (*ppenumCLSID == NULL) { HeapFree(GetProcessHeap(), 0, categories); return E_OUTOFMEMORY; } IEnumGUID_AddRef(*ppenumCLSID); return S_OK; }
/********************************************************************** * COMCAT_ICatInformation_IsClassOfCategories */ static HRESULT WINAPI COMCAT_ICatInformation_IsClassOfCategories( LPCATINFORMATION iface, REFCLSID rclsid, ULONG cImplemented, CATID *rgcatidImpl, ULONG cRequired, CATID *rgcatidReq) { /* ICOM_THIS_MULTI(ComCatMgrImpl, infVtbl, iface); */ WCHAR keyname[45] = { 'C', 'L', 'S', 'I', 'D', '\\', 0 }; HRESULT res; struct class_categories *categories; HKEY key; if (WINE_TRACE_ON(ole)) { ULONG count; TRACE("\n\tCLSID:\t%s\n\tImplemented %u\n",debugstr_guid(rclsid),cImplemented); for (count = 0; count < cImplemented; ++count) TRACE("\t\t%s\n",debugstr_guid(&rgcatidImpl[count])); TRACE("\tRequired %u\n",cRequired); for (count = 0; count < cRequired; ++count) TRACE("\t\t%s\n",debugstr_guid(&rgcatidReq[count])); } if ((cImplemented && rgcatidImpl == NULL) || (cRequired && rgcatidReq == NULL)) return E_POINTER; res = StringFromGUID2(rclsid, keyname + 6, 39); if (FAILED(res)) return res; categories = COMCAT_PrepareClassCategories(cImplemented, rgcatidImpl, cRequired, rgcatidReq); if (categories == NULL) return E_OUTOFMEMORY; res = RegOpenKeyExW(HKEY_CLASSES_ROOT, keyname, 0, KEY_READ, &key); if (res == ERROR_SUCCESS) { res = COMCAT_IsClassOfCategories(key, categories); RegCloseKey(key); } else res = S_FALSE; HeapFree(GetProcessHeap(), 0, categories); return res; }