/********************************************************************** * 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; }
static HRESULT WINAPI COMCAT_CLSID_IEnumGUID_Next( LPENUMGUID iface, ULONG celt, GUID *rgelt, ULONG *pceltFetched) { CLSID_IEnumGUIDImpl *This = (CLSID_IEnumGUIDImpl *)iface; ULONG fetched = 0; TRACE("\n"); if (rgelt == NULL) return E_POINTER; if (This->key) while (fetched < celt) { LSTATUS res; HRESULT hr; WCHAR clsid[39]; DWORD cName = 39; HKEY subkey; res = RegEnumKeyExW(This->key, This->next_index, clsid, &cName, NULL, NULL, NULL, NULL); if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) break; ++(This->next_index); hr = CLSIDFromString(clsid, rgelt); if (FAILED(hr)) continue; res = RegOpenKeyExW(This->key, clsid, 0, KEY_READ, &subkey); if (res != ERROR_SUCCESS) continue; hr = COMCAT_IsClassOfCategories(subkey, This->categories); RegCloseKey(subkey); if (hr != S_OK) continue; ++fetched; ++rgelt; } if (pceltFetched) *pceltFetched = fetched; return fetched == celt ? S_OK : S_FALSE; }