dyrektywa #import (C++)

Specyficzne dla języka C++

Służy do dołączania informacji z biblioteki typów. Zawartość biblioteki typów jest konwertowana na klasy języka C++, głównie opisując interfejsy COM.

Składnia

#import "nazwa pliku" [atrybuty]
<#import nazwa pliku> [atrybuty]

Parametry

Pod nazwą
Określa bibliotekę typów do zaimportowania. Nazwa pliku może być jednym z następujących rodzajów:

  • Nazwa pliku, który zawiera bibliotekę typów, taką jak .olb, .tlb lub .dll. Słowo kluczowe , file:może poprzedzać każdą nazwę pliku.

  • Progid kontrolki w bibliotece typów. Słowo kluczowe , progid:może poprzedzać każdy progid. Przykład:

    #import "progid:my.prog.id.1.5"
    

    Aby uzyskać więcej informacji na temat progidów, zobacz Określanie identyfikatora lokalizacji i numeru wersji.

    W przypadku korzystania z 32-bitowego kompilatora krzyżowego w 64-bitowym systemie operacyjnym kompilator może odczytywać tylko gałąź rejestru 32-bitowego. Możesz użyć natywnego kompilatora 64-bitowego do kompilowania i rejestrowania biblioteki typów 64-bitowych.

  • Identyfikator biblioteki typów. Słowo kluczowe , libid:może poprzedzać każdy identyfikator biblioteki. Przykład:

    #import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
    

    Jeśli nie określisz version elementu lub lcid, reguły zastosowane do progid: programu zostaną również zastosowane do libid:elementu .

  • Plik wykonywalny (.exe).

  • Plik biblioteki (dll) zawierający zasób biblioteki typów (na przykład plik ocx).

  • Dokument złożony zawierający bibliotekę typów.

  • Dowolny inny format pliku, który można zrozumieć za pomocą interfejsu API LoadTypeLib .

Atrybuty
Co najmniej jeden atrybut #import. Rozdziel atrybuty spacją lub przecinkami. Przykład:

#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only

— lub —

#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only

Uwagi

Kolejność wyszukiwania nazwy pliku

nazwa pliku jest opcjonalnie poprzedzona specyfikacją katalogu. Nazwa pliku musi nazwać istniejący plik. Różnica między dwiema formularzami składni jest kolejnością, w której preprocesor wyszukuje pliki biblioteki typów, gdy ścieżka jest niepełno określona.

Formularz składniowy Akcja
Formularz cytowany Instruuje preprocesor, aby najpierw wyszukał pliki biblioteki typów w katalogu pliku, który zawiera instrukcję #import , a następnie w katalogach dowolnego pliku zawiera (#include) ten plik. Następnie preprocesor wyszukuje ścieżki przedstawione poniżej.
Formularz nawiasu kątowego Instruuje preprocesor, aby wyszukał pliki biblioteki typów w następujących ścieżkach:

1. PATH Lista ścieżek zmiennych środowiskowych
2. LIB Lista ścieżek zmiennych środowiskowych
3. Ścieżka określona przez /I opcji kompilatora, z wyjątkiem kompilatora wyszukuje bibliotekę typów, do którego odwołuje się inna biblioteka typów z atrybutem no_registry .

Określanie identyfikatora lokalizacji i numeru wersji

Po określeniu identyfikatora progid można również określić identyfikator lokalizacji i numer wersji progid. Przykład:

#import "progid:my.prog.id" lcid("0") version("4.0)

Jeśli nie określisz identyfikatora lokalizacji, zostanie wybrany identyfikator progid zgodnie z następującymi regułami:

  • Jeśli jest tylko jeden identyfikator lokalizacji, jest używany.

  • Jeśli jest więcej niż jeden identyfikator lokalizacji, zostanie użyty pierwszy z numerem wersji 0, 9 lub 409.

  • Jeśli istnieje więcej niż jeden identyfikator lokalizacji i żaden z nich nie ma wartości 0, 9 lub 409, zostanie użyty ostatni.

  • Jeśli nie określisz numeru wersji, zostanie użyta najnowsza wersja.

Pliki nagłówkowe utworzone przez importowanie

#import tworzy dwa pliki nagłówkowe, które rekonstruuje zawartość biblioteki typów w kodzie źródłowym języka C++. Plik nagłówka podstawowego jest podobny do pliku utworzonego przez kompilator języka Microsoft Interface Definition Language (MIDL), ale z dodatkowym kodem i danymi wygenerowanymi przez kompilator. Plik nagłówka podstawowego ma taką samą nazwę podstawową jak biblioteka typów oraz . Rozszerzenie TLH. Plik nagłówka pomocniczego ma taką samą nazwę podstawową jak biblioteka typów z elementem . Rozszerzenie TLI. Zawiera on implementacje funkcji składowych generowanych przez kompilator i jest dołączany (#include) do pliku nagłówka podstawowego.

W przypadku importowania właściwości dispinterface używającej byref parametrów #import nie generuje instrukcji __declspec(property) dla funkcji.

Oba pliki nagłówka są umieszczane w katalogu wyjściowym określonym przez /Fo (nazwa pliku obiektu) opcji. Następnie są odczytywane i kompilowane przez kompilator tak, jakby plik nagłówka podstawowego został nazwany dyrektywą #include .

Następujące optymalizacje kompilatora zawierają dyrektywę #import :

  • Plik nagłówka, podczas tworzenia, ma taki sam znacznik czasu jak biblioteka typów.

  • Po przetworzeniu #import kompilator najpierw sprawdza, czy nagłówek istnieje i czy jest aktualny. Jeśli tak, nie trzeba jej ponownie tworzyć.

Dyrektywa #import uczestniczy również w minimalnej kompilacji i może zostać umieszczona w wstępnie skompilowany plik nagłówkowy. Aby uzyskać więcej informacji, zobacz Tworzenie wstępnie skompilowanych plików nagłówków.

Plik nagłówka podstawowej biblioteki typów

Plik nagłówka podstawowej biblioteki typów składa się z siedmiu sekcji:

  • Standardowy nagłówek: składa się z komentarzy, #include instrukcja comDEF. H (definiujące niektóre standardowe makra używane w nagłówku) i inne różne informacje o konfiguracji.

  • Odwołania do przodu i definicje typów: składa się z deklaracji struktury, takich jak struct IMyInterface i typedefs.

  • Deklaracje inteligentnego wskaźnika: klasa _com_ptr_t szablonu jest inteligentnym wskaźnikiem. Hermetyzuje wskaźniki interfejsu i eliminuje konieczność wywoływania AddReffunkcji , Releasei QueryInterface . Ukrywa również wywołanie CoCreateInstance podczas tworzenia nowego obiektu COM. W tej sekcji użyto instrukcji _COM_SMARTPTR_TYPEDEF makra do ustanowienia definicji typów interfejsów COM jako specjalizacji szablonów klasy szablonu _com_ptr_t . Na przykład dla interfejsu IMyInterface, . Plik TLH będzie zawierać:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    który kompilator rozszerzy do:

    typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
    

    Następnie można użyć typu IMyInterfacePtr zamiast nieprzetworzonego wskaźnika IMyInterface*interfejsu . W związku z tym nie ma potrzeby wywoływania różnych IUnknown funkcji składowych

  • Deklaracje typeinfo: przede wszystkim składa się z definicji klas i innych elementów uwidaczniających poszczególne elementy typeinfo zwracane przez ITypeLib:GetTypeInfoelement . W tej sekcji każda informacja o typie z biblioteki typów jest odzwierciedlana w nagłówku w formularzu TYPEKIND zależnym od informacji.

  • Opcjonalna definicja identyfikatora GUID starego stylu: zawiera inicjacje nazwanych stałych GUID. Te nazwy mają postać CLSID_CoClass i IID_Interface, podobne do tych wygenerowanych przez kompilator MIDL.

  • #include instrukcja nagłówka biblioteki typów pomocniczych.

  • Standardowy stopka: obecnie zawiera #pragma pack(pop)element .

Wszystkie sekcje, z wyjątkiem sekcji kotłowej nagłówka i stopki, są ujęte w przestrzeni nazw o nazwie określonej przez library instrukcję w oryginalnym pliku IDL. Nazwy z nagłówka biblioteki typów można użyć przez jawną kwalifikację przy użyciu nazwy przestrzeni nazw. Możesz też uwzględnić następującą instrukcję:

using namespace MyLib;

bezpośrednio po instrukcji #import w kodzie źródłowym.

Przestrzeń nazw można pominąć przy użyciu atrybutu no_namespace) dyrektywy #import. Jednak pominięcie przestrzeni nazw może prowadzić do kolizji nazw. Nazwę przestrzeni nazw można również zmienić za pomocą atrybutu rename_namespace .

Kompilator udostępnia pełną ścieżkę do dowolnej zależności biblioteki typów wymaganej przez bibliotekę typów, która jest obecnie przetwarzana. Ścieżka jest zapisywana w postaci komentarzy do nagłówka biblioteki typów (. TLH) generowany przez kompilator dla każdej przetworzonej biblioteki typów.

Jeśli biblioteka typów zawiera odwołania do typów zdefiniowanych w innych bibliotekach typów, to . Plik TLH będzie zawierać komentarze następującego rodzaju:

//
// Cross-referenced type libraries:
//
//  #import "c:\path\typelib0.tlb"
//

Rzeczywista nazwa pliku w komentarzu #import jest pełną ścieżką biblioteki typów odwołującej się do krzyżowego, jak zapisano w rejestrze. Jeśli wystąpią błędy spowodowane brakującymi definicjami typów, sprawdź komentarze w nagłówku . TlH, aby zobaczyć, które biblioteki typów zależnych mogą być najpierw importowane. Prawdopodobne błędy to błędy składniowe (na przykład C2143, C2146, C2321), C2501 (brakujące specyfikatory decl) lub C2433 ("wbudowany" niedozwolone w deklaracji danych) podczas kompilowania . Plik TLI.

Aby rozwiązać problemy z błędami zależności, określ, które komentarze zależności nie są w inny sposób udostępniane przez nagłówki systemu, a następnie podaj dyrektywę #import w pewnym momencie przed dyrektywą #import biblioteki typów zależnych.

atrybuty #import

#import opcjonalnie może zawierać co najmniej jeden atrybut. Te atrybuty informują kompilator o modyfikowaniu zawartości nagłówków biblioteki typów. Symbol ukośnika odwrotnego (\) może służyć do uwzględnienia dodatkowych wierszy w pojedynczej instrukcji #import. Przykład:

#import "test.lib" no_namespace \
   rename("OldName", "NewName")

Aby uzyskać więcej informacji, zobacz #import atrybuty.

END C++ Specific

Zobacz też

Dyrektywy preprocesora
Obsługa kompilatora COM