Partilhar via


Implementação do Gerenciador de Categorias de Componentes

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

Muitas vezes é 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 Inserir controle usada em controles OLE. Essas caixas de diálogo listam todos os componentes que cumprem (ou afirmam cumprir) os contratos de interface para documentos compostos ou controles. Essas categorias existentes (documento OLE, controle OLE) não implicam uma assinatura de interface exata. Os 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 ("Inserível", "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 nomes quando muitos partidos 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 globais 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 se limita a expressar as capacidades do próprio componente. Muitos componentes exigem certos recursos dos contêineres. Quando tal 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 globais exclusivos.
  • Sob a subchave Components 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 que são fornecidas pelo componente ou que o contêiner do componente deve fornecer.

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

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