Freigeben über


Implementierung des Komponentenkategorien-Managers

Wenn die Anzahl der verfügbaren Komponenten wächst, wird es immer schwieriger, diese Komponenten zu verwalten. In Bezug auf die Schnittstellen, die sie verfügbar machen, sowie die aufgaben, die sie ausführen, bieten viele Komponenten ähnliche Funktionen.

Es ist häufig erforderlich, die Komponenten auflisten, die in einem bestimmten Kontext verwendet werden können. Beispiele hierfür sind das Dialogfeld Objekt einfügen, das in OLE-Verbunddokumenten verwendet wird, und das dialogfeld Steuerelement einfügen, das in OLE-Steuerelementen verwendet wird. In diesen Dialogfeldern werden alle Komponenten aufgeführt, die die Schnittstellenverträge für Verbunddokumente oder Steuerelemente erfüllen (oder erfüllen). Diese vorhandenen Kategorien (OLE-Dokument, OLE-Steuerelement) bedeuten keine exakte Schnittstellensignatur. OLE-Dokumente müssen einen bestimmten Satz von Kernschnittstellen verfügbar machen (z. B. IOleObject oder IPersistStorage), können aber auch zusätzliche Schnittstellen wie IOleLink-verfügbar machen.

In der Vergangenheit wurden Komponenten durch Hinzufügen eines lesbaren Namens ("Einfügebar", "Steuerelement" usw.) als Unterschlüssel zum HKEY_CLASSES_ROOT\CLSID\{...} Registrierungsschlüssels markiert, der der Komponente entspricht. Dies eignet sich gut für eine zentrale Definition von Kategorien, aber Risikokonflikten, wenn viele unabhängige Parteien neue Kategorien definieren. Wie in anderen Com-Bereichen liegt die Lösung für die Bereitstellung eines erweiterbaren Namespaces in der Verwendung von global eindeutigen Bezeichnern (GUIDs). Anstatt einen lesbaren Namen zu verwenden, wird jeder Kategorie eine eindeutige Zahl (CATID) zugewiesen.

Eine weitere Einschränkung bei der vorhandenen Kategorisierung besteht darin, dass sie darauf beschränkt ist, die Funktionen der Komponente selbst auszudrücken. Viele Komponenten erfordern bestimmte Funktionen aus den Containern. Wenn eine solche Komponente in einen Container eingefügt wird, kann die Einfügung fehlschlagen oder sich unerwartet verhalten, auch wenn die Komponente die verträge erfüllt, die von einer ihrer Kategorien impliziert werden. Um die Komponenten auflisten zu können, die in bestimmten Situationen erfolgreich verwendet werden können, müssen die Funktionen der Komponente und des Containers berücksichtigt werden.

Aufgrund dieser Überlegungen wurden die folgenden Änderungen an der vorhandenen Kategorisierung vorgenommen:

  • Kategorien werden mithilfe von CATIDs angegeben, die global eindeutige Bezeichner sind.
  • Unter dem Komponenten Unterschlüssel des Registrierungsschlüssels HKEY_CLASSES_ROOT\CLSID wurden zwei separate Unterschlüssel "Implementierte Kategorien" und "Erforderliche Kategorien" entwickelt. Diese Unterschlüssel enthalten die Listen von CATIDs, die von der Komponente bereitgestellt werden oder der Container der Komponente bereitstellen muss.

Um die Verwaltung der Komponentenkategorien zu vereinfachen, werden Kategorien an einer zentralen Stelle in der Registrierung aufgeführt: HKEY_CLASSES_ROOT\Component Categories. Dieser Schlüssel listet die installierten Kategorien sowohl mit ihrer CATID als auch mit lokalisierten, menschenlesbaren Namen auf.

Weitere Informationen finden Sie in den folgenden Themen: