Compartilhar via


Implementação do Gerenciador de Categorias de Componentes

À medida que o número de componentes disponíveis aumenta, torna-se cada vez mais difícil gerenciar esses componentes. Em termos de interfaces que eles expõem, bem como as tarefas que executam, muitos componentes oferecem funcionalidade semelhante.

Geralmente, é necessário enumerar os componentes que podem ser usados em um determinado contexto. Exemplos disso são a caixa de diálogo Inserir Objeto usada em documentos compostos OLE e a caixa de diálogo de Controle de Inserção usada em controles OLE. Essas caixas de diálogo listam todos os componentes que atendem (ou afirmam cumprir) os contratos de interface para documentos ou controles compostos. Essas categorias existentes (documento OLE, controle OLE) não implicam uma assinatura de interface exata. Documentos OLE precisam expor um determinado conjunto de interfaces principais (por exemplo, iOleObject ou IPersistStorage), mas também podem expor interfaces adicionais, como iOleLink.

No passado, os componentes foram marcados adicionando um nome legível por humanos ("Inserivel", "Controle" e assim por diante) como uma subchave à chave do registro HKEY_CLASSES_ROOT\CLSID\{...} correspondente ao componente. Isso funciona bem para uma definição central de categorias, mas corre o risco de colisões de nome quando muitas partes independentes definem novas categorias. Como em outras áreas de COM, a solução para fornecer um namespace extensível está no uso de GUIDs (identificadores globalmente exclusivos). Em vez de usar um nome legível por humanos, um número exclusivo (CATID) é atribuído a cada categoria.

Outra limitação com a categorização existente é que ela está limitada a expressar os recursos do próprio componente. Muitos componentes exigem determinadas funcionalidades dos contêineres. Quando esse componente é inserido em um contêiner, a inserção pode falhar ou se comportar inesperadamente, mesmo que o componente cumpra os contratos implícitos por uma de suas categorias. Para enumerar os componentes que podem ser usados com êxito em determinadas situações, os recursos do componente e do contêiner devem ser considerados.

Devido a essas considerações, as seguintes alterações foram feitas na categorização existente:

  • As categorias são indicadas usando CATIDs que são identificadores globalmente exclusivos.
  • Na subchave Componentes da chave do registro HKEY_CLASSES_ROOT\CLSID, duas subchaves separadas, "Categorias Implementadas" e "Categorias Necessárias", foram desenvolvidas. Essas subchaves contêm as listas de CATIDs fornecidas pelo componente ou que o contêiner do componente deve fornecer.

Para facilitar o gerenciamento das categorias de componente, as categorias são listadas em um local central no registro: HKEY_CLASSES_ROOT\Component Categories. Essa chave lista as categorias instaladas com seu CATID e com nomes localizados e legíveis por humanos.

Para obter mais informações, consulte os seguintes tópicos: