static HRESULT WINAPI COMCAT_IEnumCATEGORYINFO_Next( LPENUMCATEGORYINFO iface, ULONG celt, CATEGORYINFO *rgelt, ULONG *pceltFetched) { IEnumCATEGORYINFOImpl *This = (IEnumCATEGORYINFOImpl *)iface; ULONG fetched = 0; TRACE("\n"); if (rgelt == NULL) return E_POINTER; if (This->key) while (fetched < celt) { LSTATUS res; HRESULT hr; WCHAR catid[39]; DWORD cName = 39; HKEY subkey; res = RegEnumKeyExW(This->key, This->next_index, catid, &cName, NULL, NULL, NULL, NULL); if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) break; ++(This->next_index); hr = CLSIDFromString(catid, &rgelt->catid); if (FAILED(hr)) continue; res = RegOpenKeyExW(This->key, catid, 0, KEY_READ, &subkey); if (res != ERROR_SUCCESS) continue; hr = COMCAT_GetCategoryDesc(subkey, This->lcid, rgelt->szDescription, 128); RegCloseKey(subkey); if (FAILED(hr)) continue; rgelt->lcid = This->lcid; ++fetched; ++rgelt; } if (pceltFetched) *pceltFetched = fetched; return fetched == celt ? S_OK : S_FALSE; }
/********************************************************************** * COMCAT_ICatInformation_GetCategoryDesc */ static HRESULT WINAPI COMCAT_ICatInformation_GetCategoryDesc( LPCATINFORMATION iface, REFCATID rcatid, LCID lcid, PWCHAR *ppszDesc) { /* ICOM_THIS_MULTI(ComCatMgrImpl, infVtbl, iface); */ WCHAR keyname[60] = { 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', ' ', 'C', 'a', 't', 'e', 'g', 'o', 'r', 'i', 'e', 's', '\\', 0 }; HKEY key; HRESULT res; TRACE("\n\tCATID:\t%s\n\tLCID:\t%X\n",debugstr_guid(rcatid), lcid); if (rcatid == NULL || ppszDesc == NULL) return E_INVALIDARG; /* Open the key for this category. */ if (!StringFromGUID2(rcatid, keyname + 21, 39)) return E_FAIL; res = RegOpenKeyExW(HKEY_CLASSES_ROOT, keyname, 0, KEY_READ, &key); if (res != ERROR_SUCCESS) return CAT_E_CATIDNOEXIST; /* Allocate a sensible amount of memory for the description. */ *ppszDesc = (PWCHAR) CoTaskMemAlloc(128 * sizeof(WCHAR)); if (*ppszDesc == NULL) { RegCloseKey(key); return E_OUTOFMEMORY; } /* Get the description, and make sure it's null terminated. */ res = COMCAT_GetCategoryDesc(key, lcid, *ppszDesc, 128); RegCloseKey(key); if (FAILED(res)) { CoTaskMemFree(*ppszDesc); return res; } return S_OK; }