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
filename
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 plik 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. Na 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. Na przykład:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
Jeśli nie określisz
version
elementu lublcid
, reguły zastosowane doprogid:
programu zostaną również zastosowane dolibid:
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. Na 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 środowiskowych2. LIB Lista ścieżek zmiennych środowiskowych3. Ś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. Na 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ływaniaAddRef
funkcji ,Release
iQueryInterface
. Ukrywa również wywołanieCoCreateInstance
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 interfejsuIMyInterface
, . 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źnikaIMyInterface*
interfejsu . W związku z tym nie ma potrzeby wywoływania różnychIUnknown
funkcji składowychDeklaracje typeinfo: przede wszystkim składa się z definicji klas i innych elementów uwidaczniających poszczególne elementy typeinfo zwracane przez
ITypeLib:GetTypeInfo
element . W tej sekcji każda informacja o typie z biblioteki typów jest odzwierciedlana w nagłówku w formularzuTYPEKIND
zależnym od informacji.Opcjonalna definicja identyfikatora GUID starego stylu: zawiera inicjacje nazwanych stałych GUID. Te nazwy mają postać
CLSID_CoClass
iIID_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. Na przykład:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Aby uzyskać więcej informacji, zobacz #import atrybuty.
END C++ Specific