Atrybuty języka C++ dla modelu COM i platformy .NET

Firma Microsoft definiuje zestaw atrybutów języka C++, które upraszczają programowanie com i programowanie w środowisku uruchomieniowym języka wspólnego programu .NET Framework. W przypadku dołączania atrybutów do plików źródłowych kompilator współpracuje z bibliotekami DLL dostawcy w celu wstawiania kodu lub modyfikowania kodu w wygenerowanych plikach obiektów. Te atrybuty ułatwiają tworzenie plików idl, interfejsów, bibliotek typów i innych elementów COM. W zintegrowanym środowisku projektowym (IDE) atrybuty są obsługiwane przez kreatorów i przez okno Właściwości.

Chociaż atrybuty eliminują niektóre szczegółowe kodowanie potrzebne do pisania obiektów COM, potrzebujesz tła w podstawach modelu COM, aby najlepiej ich używać.

Uwaga

Jeśli szukasz atrybutów standardowych języka C++, zobacz Atrybuty.

Cel atrybutów

Atrybuty rozszerzają język C++ w kierunkach, które nie są obecnie możliwe bez przerywania klasycznej struktury języka. Atrybuty umożliwiają dostawcom (oddzielne biblioteki DLL) dynamiczne rozszerzanie funkcjonalności języka. Głównym celem atrybutów jest uproszczenie tworzenia składników MODELU COM, a także zwiększenie poziomu produktywności dewelopera składników. Atrybuty można stosować do niemal dowolnej konstrukcji języka C++, takiej jak klasy, składowe danych lub funkcje składowe. Poniżej przedstawiono najważniejsze korzyści zapewniane przez tę nową technologię:

  • Uwidacznia znaną i prostą konwencję wywoływania.

  • Używa wstawionego kodu, który w przeciwieństwie do makr jest rozpoznawany przez debuger.

  • Umożliwia łatwe wyprowadzanie z klas bazowych bez uciążliwych szczegółów implementacji.

  • Zastępuje dużą ilość kodu IDL wymaganego przez składnik COM kilkoma zwięzłymi atrybutami.

Na przykład w celu zaimplementowania prostego ujścia zdarzeń dla ogólnej klasy ATL można zastosować atrybut event_receiver do określonej klasy, takiej jak CMyReceiver. Atrybut event_receiver jest następnie kompilowany przez kompilator języka Microsoft C++, który wstawia odpowiedni kod do pliku obiektu.

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

Następnie można skonfigurować metody i obsługiwać zdarzenia (przy użyciu funkcji wewnętrznej __hook) ze źródła zdarzeń, które można utworzyć przy użyciu event_source.handler2handler1CMyReceiver

Podstawowa mechanika atrybutów

Istnieją trzy sposoby wstawiania atrybutów do projektu. Najpierw możesz wstawić je ręcznie do kodu źródłowego. Po drugie, można je wstawić przy użyciu siatki właściwości obiektu w projekcie. Na koniec można je wstawić przy użyciu różnych kreatorów. Aby uzyskać więcej informacji na temat korzystania z okna Właściwości i różnych kreatorów, zobacz Projekty programu Visual Studio — C++.

Tak jak wcześniej, podczas kompilowania projektu kompilator analizuje każdy plik źródłowy języka C++, tworząc plik obiektu. Jednak gdy kompilator napotka atrybut, jest analizowany i syntaktycznie weryfikowany. Kompilator następnie dynamicznie wywołuje dostawcę atrybutów, aby wstawić kod lub wprowadzić inne modyfikacje w czasie kompilacji. Implementacja dostawcy różni się w zależności od typu atrybutu. Na przykład atrybuty związane z ATL są implementowane przez bibliotekę Atlprov.dll.

Na poniższej ilustracji przedstawiono relację między kompilatorem a dostawcą atrybutów.

Diagram showing component attribute communication.

Uwaga

Użycie atrybutu nie zmienia zawartości pliku źródłowego. Jedynym czasem widocznym jest wygenerowany kod atrybutu podczas sesji debugowania. Ponadto dla każdego pliku źródłowego w projekcie można wygenerować plik tekstowy, który wyświetla wyniki podstawienia atrybutu. Aby uzyskać więcej informacji na temat tej procedury, zobacz /Fx (Scal wstrzykiwany kod) i Debugowanie wprowadzonego kodu.

Podobnie jak większość konstrukcji języka C++, atrybuty mają zestaw cech definiujących ich prawidłowe użycie. Jest to nazywane kontekstem atrybutu i jest adresowane w tabeli kontekstowej atrybutów dla każdego tematu odwołania do atrybutów. Na przykład atrybut coclass można zastosować tylko do istniejącej klasy lub struktury, w przeciwieństwie do atrybutu cpp_quote , który można wstawić w dowolnym miejscu w pliku źródłowym języka C++.

Kompilowanie programu opartego na atrybutach

Po wprowadzeniu atrybutów języka Visual C++ do kodu źródłowego możesz chcieć, aby kompilator języka Microsoft C++ tworzył bibliotekę typów i plik idl. Następujące opcje konsolidatora ułatwiają tworzenie plików .tlb i idl:

Niektóre projekty zawierają wiele niezależnych plików idl. Są one używane do tworzenia co najmniej dwóch plików tlb i opcjonalnie wiązania ich z blokiem zasobów. Ten scenariusz nie jest obecnie obsługiwany w języku Visual C++.

Ponadto konsolidator języka Visual C++ wyświetli wszystkie informacje atrybutu związane z językiem IDL do pojedynczego pliku MIDL. Nie będzie można wygenerować dwóch bibliotek typów z jednego projektu.

Konteksty atrybutu

Atrybuty języka C++ można opisać przy użyciu czterech podstawowych pól: obiekt docelowy, do którego można zastosować (dotyczy), jeśli są powtarzalne lub nie (powtarzalne), wymaganą obecność innych atrybutów (wymagane atrybuty) i niezgodności z innymi atrybutami (nieprawidłowe atrybuty). Te pola są wymienione w tabeli towarzyszącej w temacie referencyjnym każdego atrybutu. Każde z tych pól zostało opisane poniżej.

Dotyczy

W tym polu opisano różne elementy języka C++, które są celami prawnymi dla określonego atrybutu. Jeśli na przykład atrybut określa "klasę" w polu Dotyczy , oznacza to, że atrybut można zastosować tylko do klasy legalnej języka C++. Jeśli atrybut jest stosowany do funkcji składowej klasy, wynik błędu składni.

Aby uzyskać więcej informacji, zobacz Atrybuty według użycia.

Powtarzalne

To pole określa, czy atrybut można wielokrotnie stosować do tego samego obiektu docelowego. Większość atrybutów nie jest powtarzalna.

Wymagane atrybuty

To pole zawiera listę innych atrybutów, które muszą być obecne (czyli stosowane do tego samego obiektu docelowego) dla określonego atrybutu do prawidłowego działania. Nietypowe jest, aby atrybut miał jakiekolwiek wpisy dla tego pola.

Nieprawidłowe atrybuty

To pole zawiera listę innych atrybutów, które są niezgodne z określonym atrybutem. Nietypowe jest, aby atrybut miał jakiekolwiek wpisy dla tego pola.

Debugowanie wprowadzonego kodu

Używanie atrybutów może znacznie uprościć programowanie w języku C++. Aby uzyskać więcej informacji, zobacz Pojęcia. Niektóre atrybuty są interpretowane bezpośrednio przez kompilator. Inne atrybuty wprowadzają kod do źródła programu, które następnie kompilator kompiluje. Ten wstrzykiwany kod ułatwia programowanie, zmniejszając ilość kodu, który trzeba napisać. Czasami jednak usterka może spowodować niepowodzenie aplikacji podczas wykonywania wprowadzonego kodu. W takim przypadku prawdopodobnie zechcesz przyjrzeć się wstrzykniętemu kodzie. Program Visual Studio udostępnia dwa sposoby wyświetlenia wprowadzonego kodu:

  • W oknie Dezasemblacji można wyświetlić wstrzyknięty kod.

  • Za pomocą /Fx można utworzyć scalony plik źródłowy zawierający oryginalny i wstrzykiwany kod.

W oknie Dezasemblacja są wyświetlane instrukcje języka zestawu, które odpowiadają kodowi źródłowemu i kodowi wprowadzonemu przez atrybuty. Ponadto okno Dezasemblacji może wyświetlać adnotację kodu źródłowego.

Aby włączyć adnotację źródłową

  • Kliknij prawym przyciskiem myszy okno Dezasemblacja , a następnie wybierz polecenie Pokaż kod źródłowy z menu skrótów.

    Jeśli znasz lokalizację atrybutu w oknie źródłowym, możesz użyć menu skrótów, aby znaleźć wstrzykiwany kod w oknie Dezasemblacji .

Aby wyświetlić wstrzykiwany kod

  1. Debuger musi być w trybie przerwania.

  2. W oknie kodu źródłowego umieść kursor przed atrybutem, którego wstrzykiwany kod ma być wyświetlany.

  3. Kliknij prawym przyciskiem myszy i wybierz polecenie Przejdź do dezasemblacji z menu skrótów.

    Jeśli lokalizacja atrybutu znajduje się w pobliżu bieżącego punktu wykonywania, możesz wybrać okno Dezasemblacja z menu Debugowanie.

Aby wyświetlić kod dezasemblacji w bieżącym punkcie wykonywania

  1. Debuger musi być w trybie przerwania.

  2. W menu Debuguj wybierz pozycję Windows, a następnie kliknij pozycję Dezasemblacja.

W tej sekcji

Programowanie oparte na atrybutach —najczęściej zadawane pytania
Atrybuty według grup
Atrybuty w zależności od zastosowania
Alfabetyczny spis atrybutów