Dela via


Implementering av Component Categories Manager

I takt med att antalet tillgängliga komponenter växer blir det allt svårare att hantera dessa komponenter. När det gäller de gränssnitt som de exponerar samt de uppgifter de utför erbjuder många komponenter liknande funktioner.

Det är ofta nödvändigt att räkna upp de komponenter som kan användas i en viss kontext. Exempel på detta är dialogrutan Infoga objekt som används i OLE-sammansatta dokument och dialogrutan Infoga kontroll som används i OLE-kontroller. I de här dialogrutorna visas alla komponenter som uppfyller (eller gör anspråk på att uppfylla) gränssnittskontrakten för sammansatta dokument eller kontroller. Dessa befintliga kategorier (OLE-dokument, OLE-kontroll) innebär inte en exakt gränssnittssignatur. OLE-dokument måste exponera en viss uppsättning kärngränssnitt (till exempel IOleObject- eller IPersistStorage) men kan även exponera ytterligare gränssnitt som IOleLink-.

Tidigare har komponenter taggats genom att lägga till ett läsbart namn ("Insertable", "Control" och så vidare) som en undernyckel till den HKEY_CLASSES_ROOT\CLSID\{...} registernyckel som motsvarar komponenten. Detta fungerar bra för en central definition av kategorier men riskerar namnkollisioner när många oberoende parter definierar nya kategorier. Precis som inom andra områden i COM ligger lösningen på att tillhandahålla ett utökningsbart namnområde i användningen av globalt unika identifierare (GUID). I stället för att använda ett läsbart namn tilldelas ett unikt nummer (CATID) till varje kategori.

En annan begränsning med den befintliga kategoriseringen är att den är begränsad till att uttrycka funktionerna i själva komponenten. Många komponenter kräver vissa funktioner från containrarna. När en sådan komponent infogas i en container kan infogningen misslyckas eller bete sig oväntat, även om komponenten uppfyller de kontrakt som en av dess kategorier innebär. Om du vill räkna upp de komponenter som kan användas i vissa situationer måste du ta hänsyn till funktionerna i både komponenten och containern.

På grund av dessa överväganden gjordes följande ändringar i den befintliga kategoriseringen:

  • Kategorier anges med hjälp av CATID:er som är globalt unika identifierare.
  • Under Components undernyckel för HKEY_CLASSES_ROOT\CLSID registernyckeln utvecklades två separata undernycklar, "Implementerade kategorier" och "Obligatoriska kategorier". Dessa undernycklar innehåller listor över CAT-ID:er som tillhandahålls av komponenten eller som komponentens container måste tillhandahålla.

För att underlätta hanteringen av komponentkategorierna visas kategorier på en central plats i registret: HKEY_CLASSES_ROOT\Component Categories. Den här nyckeln visar de installerade kategorierna både med deras CATID och med lokaliserade, läsbara namn.

Mer information finns i följande avsnitt: