コンポーネント カテゴリ マネージャーの実装
使用可能なコンポーネントの数が増えるにつれて、これらのコンポーネントの管理がますます困難になります。 公開するインターフェイスと実行するタスクに関しては、多くのコンポーネントで同様の機能が提供されます。
多くの場合、特定のコンテキストで使用できるコンポーネントを列挙する必要があります。 たとえば、OLE 複合文書で使用される [オブジェクトの挿入] ダイアログ ボックスと、OLE コントロールで使用される [コントロールの挿入] ダイアログ ボックスがあります。 これらのダイアログ ボックスには、複合ドキュメントまたはコントロールのインターフェイス コントラクトを満たす (または満たすと要求する) すべてのコンポーネントが一覧表示されます。 これらの既存のカテゴリ (OLE ドキュメント、OLE コントロール) は、正確なインターフェイスシグネチャを意味するものではありません。 OLE ドキュメントでは、特定のコア インターフェイスのセット (IOleObject や IPersistStorage など) を公開する必要がありますが、IOleLink などの追加のインターフェイスを公開することもできます。
以前は、コンポーネントに対応する HKEY_CLASStandard EditionS_ROOT\CLSID\{...} レジストリ キーにサブキーとして、人間が判読できる名前 ("Insertable"、"Control"など) を追加することで、コンポーネントにタグが付けられていた。 これは、カテゴリの中央定義に適していますが、多くの独立したパーティが新しいカテゴリを定義する場合に名前の競合が発生するリスクがあります。 COM の他の領域と同様に、拡張可能な名前空間を提供するソリューションは、グローバル一意識別子 (GUID) の使用にあります。 人間が判読できる名前を使用する代わりに、一意の番号 (CATID) が各カテゴリに割り当てられます。
既存の分類のもう 1 つの制限事項は、コンポーネント自体の機能を表現することに限定されるということです。 多くのコンポーネントには、コンテナーの特定の機能が必要です。 このようなコンポーネントがコンテナーに挿入されると、コンポーネントがそのカテゴリの 1 つによって暗黙的に指定されたコントラクトを満たしている場合でも、挿入が失敗したり、予期せず動作したりする可能性があります。 特定の状況で正常に使用できるコンポーネントを列挙するには、コンポーネントとコンテナーの両方の機能を考慮する必要があります。
これらの考慮事項により、既存の分類に次の変更が加えられました。
- カテゴリは、グローバルに一意の識別子である CATID を使用して示されます。
- HKEY_CLASStandard EditionS_ROOT\CLSID レジストリ キーの Components サブキーの下で、"実装されたカテゴリ" と "必須のカテゴリ" という 2 つのサブキーが開発されました。 これらのサブキーには、コンポーネントによって提供される CATID のリスト、またはコンポーネントのコンテナーが提供する必要がある CATID のリストが含まれています。
コンポーネントカテゴリの管理を容易にするために、カテゴリはレジストリの中央の場所に一覧表示されます: HKEY_CLASStandard EditionS_ROOT\コンポーネントカテゴリ。 このキーは、インストールされているカテゴリを CATID とローカライズされた人間が判読できる名前の両方で一覧表示します。
詳細については、次のトピックを参照してください。