C++-Attribute für COM und .NET

Microsoft definiert eine Reihe von C++-Attributen, die die Com-Programmierung und die Entwicklung von Common Language Runtime vereinfachen. Wenn Sie Attribute in Ihre Quelldateien einschließen, arbeitet der Compiler mit Anbieter-DLLs zusammen, um Code einzufügen oder den Code in den generierten Objektdateien zu ändern. Diese Attribute helfen bei der Erstellung von IDL-Dateien, Schnittstellen, Typbibliotheken und anderen COM-Elementen. In der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) werden Attribute von den Assistenten und vom Eigenschaftenfenster unterstützt.

Während Attribute einige der detaillierten Codierungen beseitigen, die zum Schreiben von COM-Objekten erforderlich sind, benötigen Sie einen Hintergrund in DEN COM-Grundlagen , um sie am besten zu verwenden.

Hinweis

Wenn Sie nach C++-Standardattributen suchen, lesen Sie "Attribute".

Attributzwecke

Attribute erweitern C++ in Richtungen, die derzeit nicht möglich sind, ohne die klassische Struktur der Sprache zu unterbrechen. Mit Attributen können Anbieter (separate DLLs) Die Sprachfunktionalität dynamisch erweitern. Das Hauptziel von Attributen besteht darin, die Erstellung von COM-Komponenten zu vereinfachen, zusätzlich zur Steigerung der Produktivität des Komponentenentwicklers. Attribute können auf nahezu jedes C++-Konstrukt angewendet werden, z. B. Klassen, Datenmember oder Memberfunktionen. Es folgt ein Highlight der Vorteile dieser neuen Technologie:

  • Macht eine vertraute und einfache Anrufkonvention verfügbar.

  • Verwendet eingefügten Code, der im Gegensatz zu Makros vom Debugger erkannt wird.

  • Ermöglicht eine einfache Ableitung von Basisklassen ohne belastende Implementierungsdetails.

  • Ersetzt die große Menge an IDL-Code, die von einer COM-Komponente benötigt wird, durch einige präzise Attribute.

Um beispielsweise eine einfache Ereignissenke für eine generische ATL-Klasse zu implementieren, können Sie das attribut event_receiver auf eine bestimmte Klasse anwenden, z CMyReceiver. B. . Das event_receiver Attribut wird dann vom Microsoft C++-Compiler kompiliert, der den richtigen Code in die Objektdatei einfügt.

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

Anschließend können Sie die CMyReceiver Methoden einrichten und handler2 Ereignisse (mithilfe der systeminternen Funktion __hook) aus einer Ereignisquelle behandeln, die Sie mit event_source erstellen können.handler1

Grundlegende Funktionsweise der Attribute

Es gibt drei Möglichkeiten, Attribute in Ihr Projekt einzufügen. Zunächst können Sie sie manuell in Den Quellcode einfügen. Zweitens können Sie sie mithilfe des Eigenschaftenrasters eines Objekts in Ihr Projekt einfügen. Schließlich können Sie sie mithilfe der verschiedenen Assistenten einfügen. Weitere Informationen zur Verwendung des Eigenschaftenfensters und der verschiedenen Assistenten finden Sie unter Visual Studio Projects - C++.

Wie zuvor analysiert der Compiler jede C++-Quelldatei, wenn das Projekt erstellt wird, eine Objektdatei. Wenn der Compiler jedoch auf ein Attribut trifft, wird es analysiert und syntaktisch überprüft. Der Compiler ruft dann dynamisch einen Attributanbieter auf, um Code einzufügen oder andere Änderungen zur Kompilierungszeit vorzunehmen. Die Implementierung des Anbieters unterscheidet sich je nach Typ des Attributs. AtL-bezogene Attribute werden beispielsweise von Atlprov.dll implementiert.

Die folgende Abbildung zeigt die Beziehung zwischen dem Compiler und dem Attributanbieter.

Diagram showing component attribute communication.

Hinweis

Die Attributverwendung ändert den Inhalt der Quelldatei nicht. Das einzige Mal, wenn der generierte Attributcode sichtbar ist, ist während Debugsitzungen. Darüber hinaus können Sie für jede Quelldatei im Projekt eine Textdatei generieren, die die Ergebnisse der Attributersetzung anzeigt. Weitere Informationen zu diesem Verfahren finden Sie unter /Fx (Zusammenführen von eingefügtem Code) und Debuggen von eingefügtem Code.

Wie die meisten C++-Konstrukte weisen Attribute eine Reihe von Merkmalen auf, die ihre ordnungsgemäße Verwendung definieren. Dies wird als Kontext des Attributs bezeichnet und in der Attributkontexttabelle für jedes Attributreferenzthema behandelt. Das Coclass-Attribut kann z. B. nur auf eine vorhandene Klasse oder Struktur angewendet werden, im Gegensatz zum attribut cpp_quote, das an einer beliebigen Stelle in einer C++-Quelldatei eingefügt werden kann.

Erstellen eines attributierten Programms

Nachdem Sie Visual C++-Attribute in Ihren Quellcode eingefügt haben, möchten Sie möglicherweise, dass der Microsoft C++-Compiler eine Typbibliothek und IDL-Datei für Sie erstellt. Mithilfe der folgenden Linkeroptionen können Sie TLB- und IDL-Dateien erstellen:

Einige Projekte enthalten mehrere unabhängige IDL-Dateien. Diese werden verwendet, um zwei oder mehr TLB-Dateien zu erzeugen und optional an den Ressourcenblock zu binden. Dieses Szenario wird in Visual C++ derzeit nicht unterstützt.

Darüber hinaus gibt der Visual C++-Linker alle IDL-bezogenen Attributinformationen in eine einzelne MIDL-Datei aus. Es gibt keine Möglichkeit, zwei Typbibliotheken aus einem einzelnen Projekt zu generieren.

Attributkontexte

C++-Attribute können mithilfe von vier grundlegenden Feldern beschrieben werden: das Ziel, auf das sie angewendet werden können (Gilt für), wenn sie wiederholbar sind oder nicht (wiederholbar), das erforderliche Vorhandensein anderer Attribute (Erforderliche Attribute) und Inkompatibilitäten mit anderen Attributen (Ungültige Attribute). Diese Felder werden in einer zugehörigen Tabelle im Referenzthema jedes Attributs aufgeführt. Jedes dieser Felder wird unten beschrieben.

Gilt für

In diesem Feld werden die verschiedenen C++-Sprachelemente beschrieben, die rechtliche Ziele für das angegebene Attribut sind. Wenn ein Attribut beispielsweise "Class" im Feld "Gilt für " angibt, gibt dies an, dass das Attribut nur auf eine gültige C++-Klasse angewendet werden kann. Wenn das Attribut auf eine Memberfunktion einer Klasse angewendet wird, würde ein Syntaxfehler auftreten.

Weitere Informationen finden Sie unter "Attribute by Usage".

Wiederholbar

Dieses Feld gibt an, ob das Attribut wiederholt auf dasselbe Ziel angewendet werden kann. Der Großteil der Attribute ist nicht wiederholbar.

Erforderliche Attribute.

Dieses Feld listet weitere Attribute auf, die vorhanden sein müssen (d. h. auf dasselbe Ziel angewendet), damit das angegebene Attribut ordnungsgemäß funktioniert. Es ist ungewöhnlich, dass ein Attribut Einträge für dieses Feld enthält.

Ungültige Attribute

Dieses Feld listet andere Attribute auf, die mit dem angegebenen Attribut nicht kompatibel sind. Es ist ungewöhnlich, dass ein Attribut Einträge für dieses Feld enthält.

Debuggen von eingefügtem Code

Die Verwendung von Attributen kann die C++-Programmierung erheblich vereinfachen. Weitere Informationen finden Sie unter Konzepte. Einige Attribute werden direkt vom Compiler interpretiert. Andere Attribute fügen Code in den Programmquellcode ein, der anschließend vom Compiler kompiliert wird. Dieser eingefügte Code kann die Programmierung vereinfachen, da weniger Code geschrieben werden muss. Manchmal kann die Anwendung jedoch aufgrund eines Fehlers fehlschlagen, der beim Ausführen von eingefügtem Code auftritt. In diesem Fall möchten Sie den eingefügten Code wahrscheinlich überprüfen. Visual Studio bietet zwei Möglichkeiten, eingefügten Code zu überprüfen:

  • Sie können den eingefügten Code im Fenster Disassemblierung anzeigen.

  • Sie können mit /Fx eine zusammengeführte Quelldatei erstellen, die sowohl Original- als auch den eingefügten Code enthält.

Im Fenster Disassemblierung werden Assemblysprachanweisungen angezeigt, die für den Quellcode sowie für den mittels Attributen eingefügten Code stehen. Darüber hinaus können im Fenster Disassemblierung Quellcodeanmerkungen angezeigt werden.

So aktivieren Sie Quellcodeanmerkungen

  • Klicken Sie mit der rechten Maustaste auf das Disassemblierungsfenster, und wählen Sie im Kontextmenü Quellcode anzeigen aus.

    Wenn Sie wissen, an welcher Stelle sich ein Attribut im Quellcodefenster befindet, können Sie das Kontextmenü verwenden, um den eingefügten Code im Disassemblierungsfenster zu suchen.

So zeigen Sie eingefügten Code an

  1. Der Debugger muss sich im Unterbrechungsmodus befinden.

  2. Positionieren Sie den Cursor im Quellcodefenster vor dem Attribut, dessen eingefügter Code angezeigt werden soll.

  3. Klicken Sie mit der rechten Maustaste, und wählen Sie im Kontextmenü Zu Disassemblierung wechseln aus.

    Wenn sich das Attribut in der Nähe des aktuellen Ausführungspunktes befindet, können Sie das Disassemblierungsfenster über das Menü Debuggen öffnen.

So zeigen Sie den Disassemblycode am aktuellen Ausführungspunkt an

  1. Der Debugger muss sich im Unterbrechungsmodus befinden.

  2. Wählen Sie im Menü Debuggen die Option Fenster aus, und klicken Sie auf Disassemblierung.

In diesem Abschnitt

Fragen und Antworten zur attributierten Programmierung
Attribute nach Gruppen
Attribute nach Verwendung
Alphabetische Attributreferenz