Partilhar via


Atributos C++ para COM e .NET

A Microsoft define um conjunto de atributos C++ que simplificam a programação COM e o desenvolvimento de Common Language Runtime do .NET Framework. Quando você inclui atributos em seus arquivos de origem, o compilador trabalha com DLLs de provedor para inserir código ou modificar o código nos arquivos de objeto gerados. Esses atributos ajudam na criação de arquivos .idl, interfaces, bibliotecas de tipos e outros elementos COM. No ambiente de desenvolvimento integrado (IDE), os atributos são suportados pelos assistentes e pela janela de Propriedades.

Embora os atributos eliminem parte da codificação detalhada necessária para escrever objetos COM, você precisa de um fundo em fundamentos COM para melhor usá-los.

Observação

Se você estiver procurando por atributos padrão C++, consulte Atributos.

Finalidade dos atributos

Os atributos estendem o C++ em direções que atualmente não são possíveis sem quebrar a estrutura clássica da linguagem. Os atributos permitem que os provedores (DLLs separadas) estendam a funcionalidade do idioma dinamicamente. O principal objetivo dos atributos é simplificar a criação de componentes COM, além de aumentar o nível de produtividade do desenvolvedor de componentes. Os atributos podem ser aplicados a praticamente qualquer construção C++, como classes, membros de dados ou funções de membro. Destacam-se os benefícios proporcionados por esta nova tecnologia:

  • Expõe uma convenção de chamada familiar e simples.

  • Usa código inserido, que, ao contrário das macros, é reconhecido pelo depurador.

  • Permite derivação fácil de classes base sem detalhes de implementação onerosos.

  • Substitui a grande quantidade de código IDL exigida por um componente COM por alguns atributos concisos.

Por exemplo, para implementar um coletor de eventos simples para uma classe ATL genérica, você pode aplicar o atributo event_receiver a uma classe específica, como CMyReceiver. O event_receiver atributo é então compilado pelo compilador Microsoft C++, que insere o código adequado no arquivo de objeto.

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

Em seguida, você pode configurar os CMyReceiver métodos handler1 e handler2 manipular eventos (usando a função intrínseca __hook) a partir de uma fonte de eventos, que você pode criar usando event_source.

Mecânica Básica dos Atributos

Há três maneiras de inserir atributos em seu projeto. Primeiro, você pode inseri-los manualmente em seu código-fonte. Em segundo lugar, você pode inseri-los usando a grade de propriedades de um objeto em seu projeto. Finalmente, você pode inseri-los usando os vários assistentes. Para obter mais informações sobre como usar a janela Propriedades e os vários assistentes, consulte Projetos do Visual Studio - C++.

Como antes, quando o projeto é construído, o compilador analisa cada arquivo de origem C++, produzindo um arquivo de objeto. No entanto, quando o compilador encontra um atributo, ele é analisado e verificado sintaticamente. Em seguida, o compilador chama dinamicamente um provedor de atributos para inserir código ou fazer outras modificações em tempo de compilação. A implementação do provedor difere dependendo do tipo de atributo. Por exemplo, atributos relacionados a ATL são implementados por Atlprov.dll.

A figura a seguir demonstra a relação entre o compilador e o provedor de atributos.

Diagrama mostrando a comunicação de atributos do componente.

Observação

O uso do atributo não altera o conteúdo do arquivo de origem. A única vez que o código de atributo gerado é visível é durante as sessões de depuração. Além disso, para cada arquivo de origem no projeto, você pode gerar um arquivo de texto que exibe os resultados da substituição de atributo. Para obter mais informações sobre este procedimento, consulte /Fx (Fusão de Código Injetado) e Depurar código injetado.

Como a maioria das construções C++, os atributos têm um conjunto de características que define seu uso adequado. Isso é conhecido como o contexto do atributo e é abordado na tabela de contexto de atributo para cada tópico de referência de atributo. Por exemplo, o atributo coclass só pode ser aplicado a uma classe ou estrutura existente, em oposição ao atributo cpp_quote , que pode ser inserido em qualquer lugar dentro de um arquivo de origem C++.

Construindo um Programa Atribuído

Depois de colocar atributos do Visual C++ em seu código-fonte, talvez você queira que o compilador do Microsoft C++ produza uma biblioteca de tipos e um arquivo .idl para você. As seguintes opções de vinculador ajudam a criar arquivos .tlb e .idl:

Alguns projetos contêm vários arquivos .idl independentes. Eles são usados para produzir dois ou mais arquivos .tlb e, opcionalmente, vinculá-los ao bloco de recursos. Este cenário não é suportado atualmente no Visual C++.

Além disso, o vinculador do Visual C++ produzirá todas as informações de atributo relacionadas ao IDL para um único arquivo MIDL. Não haverá como gerar duas bibliotecas de tipos a partir de um único projeto.

Contextos de atributos

Os atributos C++ podem ser descritos usando quatro campos básicos: o destino ao qual podem ser aplicados (Aplica-se a), se são repetíveis ou não (Repetível), a presença necessária de outros atributos (Atributos Necessários) e incompatibilidades com outros atributos (Atributos Inválidos). Esses campos são listados em uma tabela anexa no tópico de referência de cada atributo. Cada um destes campos é descrito abaixo.

Aplica-se a

Este campo descreve os diferentes elementos da linguagem C++ que são destinos legais para o atributo especificado. Por exemplo, se um atributo especificar "classe" no campo Aplica-se a , isso indica que o atributo só pode ser aplicado a uma classe C++ legal. Se o atributo for aplicado a uma função membro de uma classe, ocorrerá um erro de sintaxe.

Para obter mais informações, consulte Atributos por uso.

Repetível

Este campo indica se o atributo pode ser repetidamente aplicado ao mesmo destino. A maioria dos atributos não é repetível.

Atributos necessários

Este campo lista outros atributos que precisam estar presentes (ou seja, aplicados ao mesmo destino) para que o atributo especificado funcione corretamente. É incomum que um atributo tenha entradas para este campo.

Atributos inválidos

Este campo lista outros atributos que são incompatíveis com o atributo especificado. É incomum que um atributo tenha entradas para este campo.

Depurar o código injetado

O uso de atributos pode simplificar muito a programação em C++. Alguns atributos são interpretados diretamente pelo compilador. Outros atributos injetam código na fonte do programa, que o compilador então compila. Este código injetado torna a programação mais fácil, reduzindo a quantidade de código que você tem que escrever. Às vezes, no entanto, um bug pode fazer com que seu aplicativo falhe enquanto estiver executando o código injetado. Quando isso acontece, você provavelmente vai querer olhar para o código injetado. Visual Studio fornece duas maneiras para você ver o código injetado:

  • Você pode visualizar o código injetado na janela Desmontagem .

  • Usando /Fx, você pode criar um arquivo fonte mesclado que contém código original e injetado.

A janela Desmontagem mostra instruções de linguagem de montagem que correspondem ao código-fonte e ao código injetado pelos atributos. Além disso, a janela Desmontagem pode mostrar a anotação do código-fonte.

Para ativar a Anotação de origem

  • Clique com o botão direito do mouse na janela Desmontagem e escolha Mostrar código-fonte no menu de atalho.

    Se você souber o local de um atributo em uma janela de origem, poderá usar o menu de atalho para localizar o código injetado na janela Desmontagem .

Para visualizar o código injetado

  1. O depurador deve estar no modo de interrupção.

  2. Em uma janela de código-fonte, coloque o cursor na frente do atributo cujo código injetado você deseja visualizar.

  3. Clique com o botão direito do mouse e selecione Ir para desmontagem no menu de atalho.

    Se o local do atributo estiver perto do ponto de execução atual, você poderá selecionar a janela Desmontagem no menu Depurar .

Para exibir o código de desmontagem no ponto de execução atual

  1. O depurador deve estar no modo de interrupção.

  2. No menu Depurar , escolha Windows e clique em Desmontar.

Na presente seção

Perguntas frequentes sobre programação de atributos
Atributos por Grupo
Atributos por uso
Referência alfabética de atributos