Delen via


C++-kenmerken voor COM en .NET

Microsoft definieert een set C++-kenmerken die com-programmering en .NET Framework common language runtime-ontwikkeling vereenvoudigen. Wanneer u kenmerken in uw bronbestanden opneemt, werkt de compiler met provider-DLL's om code in te voegen of de code in de gegenereerde objectbestanden te wijzigen. Deze kenmerken helpen bij het maken van .idl-bestanden, interfaces, typebibliotheken en andere COM-elementen. In de integrated development environment (IDE) worden kenmerken ondersteund door de wizards en in het venster Eigenschappen.

Hoewel kenmerken een deel van de gedetailleerde codering voorkomen die nodig zijn om COM-objecten te schrijven, hebt u een achtergrond in COM-basisprincipes nodig om ze het beste te kunnen gebruiken.

Opmerking

Als u op zoek bent naar C++-standaardkenmerken, raadpleegt u Kenmerken.

Doel van kenmerken

Kenmerken breiden C++ uit in richtingen die momenteel niet mogelijk zijn zonder de klassieke structuur van de taal te verbreken. Met kenmerken kunnen providers (afzonderlijke DLL's) taalfunctionaliteit dynamisch uitbreiden. Het primaire doel van kenmerken is om het ontwerpen van COM-onderdelen te vereenvoudigen, naast het verhogen van het productiviteitsniveau van de onderdeelontwikkelaar. Kenmerken kunnen worden toegepast op vrijwel elke C++-constructie, zoals klassen, gegevensleden of lidfuncties. Hier volgt een hoogtepunt van de voordelen van deze nieuwe technologie:

  • Biedt een vertrouwde en eenvoudige aanroepconventie.

  • Gebruikt ingevoegde code, die, in tegenstelling tot macro's, wordt herkend door het foutopsporingsprogramma.

  • Maakt eenvoudige afleiding van basisklassen mogelijk zonder lastige implementatiedetails.

  • Vervangt de grote hoeveelheid IDL-code die door een COM-onderdeel is vereist door een paar beknopte kenmerken.

Als u bijvoorbeeld een eenvoudige gebeurtenissink wilt implementeren voor een algemene ATL-klasse, kunt u het kenmerk event_receiver toepassen op een specifieke klasse, zoals CMyReceiver. Het event_receiver kenmerk wordt vervolgens gecompileerd door de Microsoft C++-compiler, waarmee de juiste code in het objectbestand wordt ingevoegd.

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

Vervolgens kunt u de CMyReceiver methoden handler1 instellen en handler2 gebeurtenissen (met behulp van de intrinsieke functie __hook) afhandelen vanuit een gebeurtenisbron, die u kunt maken met behulp van event_source.

Basismechanica van kenmerken

Er zijn drie manieren om kenmerken in uw project in te voegen. U kunt ze eerst handmatig invoegen in uw broncode. Ten tweede kunt u deze invoegen met behulp van het eigenschappenraster van een object in uw project. Ten slotte kunt u ze invoegen met behulp van de verschillende wizards. Zie Visual Studio Projects - C++ voor meer informatie over het gebruik van het venster Eigenschappen en de verschillende wizards.

Net als voorheen parseert de compiler elk C++-bronbestand, waardoor een objectbestand wordt geproduceerd. Wanneer de compiler echter een kenmerk tegenkomt, wordt het geparseerd en syntactisch geverifieerd. De compiler roept vervolgens dynamisch een kenmerkprovider aan om code in te voegen of andere wijzigingen aan te brengen tijdens het compileren. De implementatie van de provider verschilt afhankelijk van het type kenmerk. AtL-gerelateerde kenmerken worden bijvoorbeeld geïmplementeerd door Atlprov.dll.

In de volgende afbeelding ziet u de relatie tussen de compiler en de kenmerkprovider.

Diagram met de communicatie van onderdeelkenmerken.

Opmerking

Kenmerkgebruik wijzigt de inhoud van het bronbestand niet. De enige keer dat de gegenereerde kenmerkcode zichtbaar is, is tijdens foutopsporingssessies. Daarnaast kunt u voor elk bronbestand in het project een tekstbestand genereren dat de resultaten van de vervanging van het kenmerk weergeeft. Zie voor meer informatie over deze procedure /Fx (Geïnjecteerde code samenvoegen) en Geïnjecteerde code debuggen.

Net als bij de meeste C++-constructies hebben kenmerken een set kenmerken waarmee het juiste gebruik wordt gedefinieerd. Dit wordt de context van het kenmerk genoemd en wordt behandeld in de contexttabel van het kenmerk voor elk kenmerkreferentieonderwerp. Het kenmerk coclass kan bijvoorbeeld alleen worden toegepast op een bestaande klasse of structuur, in plaats van het kenmerk cpp_quote , dat overal in een C++-bronbestand kan worden ingevoegd.

Een toegeschreven programma bouwen

Nadat u Visual C++-kenmerken in uw broncode hebt geplaatst, wilt u mogelijk dat de Microsoft C++-compiler een typebibliotheek en .idl-bestand voor u produceert. Met de volgende linkeropties kunt u .tlb- en .idl-bestanden bouwen:

Sommige projecten bevatten meerdere onafhankelijke .idl-bestanden. Deze worden gebruikt om twee of meer .tlb-bestanden te produceren en optioneel te binden aan het resourceblok. Dit scenario wordt momenteel niet ondersteund in Visual C++.

Bovendien voert de Visual C++-linker alle idL-gerelateerde kenmerkinformatie uit naar één MIDL-bestand. Er is geen manier om twee typebibliotheken van één project te genereren.

Kenmerkcontexten

C++ kenmerken kunnen worden beschreven met behulp van vier basisvelden: het doel waarop ze kunnen worden toegepast (van toepassing op), als ze herhaalbaar zijn of niet (herhaalbaar), de vereiste aanwezigheid van andere kenmerken (vereiste kenmerken) en incompatibiliteit met andere kenmerken (ongeldige kenmerken). Deze velden worden vermeld in een bijbehorende tabel in het naslagonderwerp van elk kenmerk. Elk van deze velden wordt hieronder beschreven.

Van toepassing op

In dit veld worden de verschillende C++-taalelementen beschreven die juridische doelen zijn voor het opgegeven kenmerk. Als een kenmerk bijvoorbeeld klasse opgeeft in het veld Van toepassing op , geeft dit aan dat het kenmerk alleen kan worden toegepast op een juridische C++-klasse. Als het kenmerk wordt toegepast op een lidfunctie van een klasse, zou er een syntaxisfout optreden.

Zie Kenmerken per gebruik voor meer informatie.

Herhaalbaar

Dit veld geeft aan of het kenmerk herhaaldelijk op hetzelfde doel kan worden toegepast. Het merendeel van de kenmerken kan niet worden herhaald.

Vereiste kenmerken

Dit veld bevat andere kenmerken die aanwezig moeten zijn (dat wil gezegd, toegepast op hetzelfde doel) voor het opgegeven kenmerk om correct te functioneren. Het is ongebruikelijk dat een kenmerk vermeldingen voor dit veld bevat.

Ongeldige kenmerken

Dit veld bevat andere kenmerken die niet compatibel zijn met het opgegeven kenmerk. Het is ongebruikelijk dat een kenmerk vermeldingen voor dit veld bevat.

Fouten opsporen in geïnjecteerde code

Het gebruik van kenmerken kan het programmeren met C++ aanzienlijk vereenvoudigen. Sommige kenmerken worden rechtstreeks door de compiler geïnterpreteerd. Andere kenmerken injecteren code in de programmabron, die vervolgens door de compiler wordt gecompileerd. Deze geïnjecteerde code maakt programmeren eenvoudiger door de hoeveelheid code te verminderen die u moet schrijven. Soms kan een fout echter ertoe leiden dat uw toepassing mislukt terwijl deze geïnjecteerde code uitvoert. Als dit gebeurt, wilt u waarschijnlijk de geïnjecteerde code bekijken. Visual Studio biedt twee manieren om geïnjecteerde code te zien:

  • U kunt geïnjecteerde code bekijken in het venster Demontage .

  • Met behulp van /Fx kunt u een samengevoegd bronbestand maken dat oorspronkelijke en geïnjecteerde code bevat.

In het venster Demontage ziet u instructies in de assemblytaal die overeenkomen met de broncode en de code die door attributen is geïnjecteerd. Daarnaast kan het venster Demontage broncodeannotaties weergeven.

Bronannotatie inschakelen

  • Klik met de rechtermuisknop op het venster Demontage en kies Broncode weergeven in het snelmenu.

    Als u de locatie van een kenmerk in een bronvenster weet, kunt u het snelmenu gebruiken om de geïnjecteerde code te vinden in het venster Demontage .

Ingevoegde code weergeven

  1. De debugger moet in onderbrekingsmodus zijn.

  2. Plaats in een broncodevenster de cursor vóór het kenmerk waarvan u de geïnjecteerde code wilt weergeven.

  3. Klik met de rechtermuisknop en selecteer Ga naar demontage in het snelmenu.

    Als de kenmerklocatie zich dicht bij het huidige uitvoeringspunt bevindt, kunt u het venster Disassemblage selecteren in het menu Debuggen.

De demontagecode weergeven op het huidige uitvoeringspunt

  1. De debugger moet in onderbrekingsmodus zijn.

  2. Kies Windows in het menu Debuggen en klik op Disassemblage.

In deze sectie

Veelgestelde vragen over kenmerkprogrammering
Kenmerken per groep
Kenmerken per gebruik
Alfabetische verwijzing naar kenmerken