Atributos de C++ para COM y .NET

Microsoft define un conjunto de atributos de C++ que simplifican la programación COM y el desarrollo del Common Language Runtime de .NET Framework. Cuando se incluyen atributos en los archivos de origen, el compilador funciona con archivos DLL de proveedor para insertar código o modificar el código en los archivos de objeto generados. Estos atributos ayudan a crear archivos .idl, interfaces, bibliotecas de tipos y otros elementos COM. En el entorno de desarrollo integrado (IDE), tanto los asistentes como la ventana Propiedades admiten los atributos.

Aunque los atributos eliminan algunas de las codificaciones detalladas necesarias para escribir objetos COM, necesita conocimiento previo sobre los aspectos básicos de COM para usarlos mejor.

Nota:

Si busca atributos estándar de C++, consulte Atributos.

Objetivo de los atributos

Los atributos amplían C++ en direcciones que no son posibles actualmente sin interrumpir la estructura clásica del lenguaje. Los atributos permiten a los proveedores (archivos DLL independientes) ampliar dinámicamente la funcionalidad del lenguaje. El objetivo principal de los atributos es simplificar la creación de componentes COM, además de aumentar el nivel de productividad del desarrollador de componentes. Los atributos se pueden aplicar a casi cualquier construcción de C++, como clases, miembros de datos o funciones miembro. A continuación, se muestran los aspectos destacados de las ventajas proporcionadas por esta nueva tecnología:

  • Expone una convención de llamada conocida y sencilla.

  • Usa código insertado, que, a diferencia de las macros, es reconocido por el depurador.

  • Permite una derivación sencilla de clases base sin detalles de implementación pesados.

  • Reemplaza la gran cantidad de código IDL requerido por un componente COM por algunos atributos concisos.

Por ejemplo, para implementar un receptor de eventos simple para una clase ATL genérica, podría aplicar el atributo event_receiver a una clase específica, como CMyReceiver. A continuación, el compilador de Microsoft C++ compila el atributo event_receiver, que inserta el código adecuado en el archivo de objeto.

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

Luego, puede configurar los métodos CMyReceiver, handler1 y handler2, para controlar eventos (mediante la función intrínseca __hook) desde un origen de eventos, que puede crear mediante event_source.

Mecanismos básicos de los atributos

Existen tres maneras de insertar atributos en el proyecto. En primer lugar, puede insertarlos manualmente en el código fuente. En segundo lugar, puede insertarlos mediante la cuadrícula de propiedades de un objeto en el proyecto. Por último, puede insertarlos mediante los distintos asistentes. Para obtener más información sobre el uso de la ventana Propiedades y los distintos asistentes, consulte Proyectos de Visual Studio : C++.

Como antes, cuando se compila el proyecto, el compilador analiza cada archivo de origen de C++, lo que genera un archivo de objeto. Sin embargo, cuando el compilador encuentra un atributo, se analiza y se comprueba sintácticamente. A continuación, el compilador llama dinámicamente a un proveedor de atributos para insertar código o realizar otras modificaciones en tiempo de compilación. La implementación del proveedor difiere en función del tipo de atributo. Por ejemplo, los atributos relacionados con ATL se implementan mediante Atlprov.dll.

En la ilustración siguiente, se muestra la relación entre el compilador y el proveedor de atributos.

Diagram showing component attribute communication.

Nota:

El uso de atributos no modifica el contenido del archivo de origen. La única vez que el código de atributo generado es visible durante las sesiones de depuración. Además, para cada archivo de origen del proyecto, puede generar un archivo de texto que muestre los resultados de la sustitución de atributos. Para obtener más información sobre este procedimiento, vea /Fx (Combinar código insertado) y Depurar código insertado.

Al igual que la mayoría de las construcciones de C++, los atributos tienen un conjunto de características que definen su uso adecuado. Esto se conoce como el contexto del atributo y se aborda en la tabla de contexto de atributo para cada tema de referencia de atributo. Por ejemplo, el atributo coclass solo se puede aplicar a una clase o estructura existente, en lugar del atributo cpp_quote, que se puede insertar en cualquier parte de un archivo de origen de C++.

Compilar programas con atributos

Después de colocar atributos de Visual C++ en el código fuente, es posible que quiera que el compilador de Microsoft C++ genere una biblioteca de tipos y un archivo .idl. Las siguientes opciones del enlazador le ayudan a compilar archivos .tlb y .idl:

Algunos proyectos contienen varios archivos .idl independientes. Se usan para generar dos o más archivos .tlb y, de manera opcional, enlazarlos al bloque de recursos. Este escenario no se admite actualmente en Visual C++.

Además, el enlazador de Visual C++ generará toda la información de atributo relacionada con IDL en un único archivo MIDL. No habrá ninguna manera de generar dos bibliotecas de tipos a partir de un único proyecto.

Contextos de atributos

Los atributos de C++ se pueden describir mediante cuatro campos básicos: el destino al que se pueden aplicar (Se aplica a), si son reiterativos o no (Reiterativo), la presencia necesaria de otros atributos (Atributos necesarios) y las incompatibilidades con otros atributos (Atributos no válidos). Estos campos se enumeran en una tabla adjunta en el tema de referencia de cada atributo. A continuación, se describe cada uno de estos campos.

Se aplica a

En este campo, se describen los distintos elementos del lenguaje C++ que son destinos legales para el atributo especificado. Por ejemplo, si un atributo especifica "class" en el campo Se aplica a, esto indica que el atributo solo se puede aplicar a una clase de C++ legal. Si el atributo se aplica a una función miembro de una clase, se producirá un error de sintaxis.

Para obtener más información, consulte Atributos por uso.

Reiterativo

Este campo indica si el atributo se puede aplicar repetidamente al mismo destino. La mayoría de los atributos no se pueden repetir.

Atributos necesarios

En este campo, se enumeran otros atributos que deben estar presentes (es decir, aplicados al mismo destino) para que el atributo especificado funcione correctamente. Es raro que un atributo tenga entradas para este campo.

Atributos no válidos

En este campo, se enumeran otros atributos que no son compatibles con el atributo especificado. Es raro que un atributo tenga entradas para este campo.

Depurar código insertado

El uso de atributos puede simplificar enormemente la programación en C++. Para más información, vea Conceptos. El compilador se encarga de interpretar directamente algunos atributos. Otros atributos insertan código en el archivo de código fuente del programa, que el compilador se encarga entonces de compilar. Este código insertado facilita la programación al reducir la cantidad de código que se debe escribir. Sin embargo, a veces un error puede hacer que la aplicación no funcione correctamente mientras se ejecuta el código insertado. En estos casos, debería examinarse el código insertado. Visual Studio proporciona dos modos de examinar el código insertado.

  • Puede ver el código insertado en la ventana Desensamblado.

  • Mediante /Fx, se puede crear un archivo de código fuente combinado que contiene código original e insertado.

La ventana Desensamblado muestra instrucciones en lenguaje de ensamblado que corresponden al código fuente y al código insertado por los atributos. Además, la ventana Desensamblado puede mostrar la anotación del código fuente.

Para activar la anotación del código fuente

  • Haga clic con el botón derecho en la ventana Desensamblado y elija Mostrar código fuente en el menú contextual.

    Si conoce la ubicación de un atributo en una ventana de código fuente, puede utilizar el menú contextual para buscar el código insertado en la ventana Desensamblado.

Para ver el código insertado

  1. El depurador debe hallarse en modo de interrupción.

  2. En una ventana de código fuente, coloque el cursor delante de los atributos cuyo código insertado desea ver.

  3. Haga clic con el botón derecho y seleccione Ir al desensamblado en el menú contextual.

    Si la ubicación del atributo está cerca del punto de ejecución actual, puede seleccionar la ventana Desensamblado en el menú Depurar.

Para ver el código de desensamblado en el punto de ejecución actual

  1. El depurador debe hallarse en modo de interrupción.

  2. En el menú Depurar, elija Ventanas y después haga clic en Desensamblado.

En esta sección

Preguntas más frecuentes de programación con atributos
Atributos por grupo
Atributos por uso
Referencia alfabética de los atributos