#import — dyrektywa (C++)

Określonego język C++

Stosowane do przyłączania informacji z biblioteki typów.Zawartość biblioteki typów jest przekształcana na klasy C++, głównie opisujące interfejsy COM.

#import "filename" [attributes]
#import <filename> [attributes]

Parametry

  • Nazwa pliku
    Określa typ biblioteki do zaimportowania.filename może mieć postać:

    • Nazwa pliku, który zawiera biblioteki typów, na przykład pliku olb, tlb lub dll.Słowo kluczowe file: może poprzedzać nazwę każdego pliku.

    • Progid kontrolki w bibliotece typów.Słowo kluczowe progid: może poprzedzać każde progid.Na przykład:

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

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

      Należy zauważyć, że podczas kompilowania z kompilatorem krzyżowym na 64-bitowym systemie operacyjnym, kompilator będzie w stanie odczytać tylko 32-bitową gałąź rejestru.Do kompilacji i zarejestrowania 64-bitowego typu biblioteki rekomenduje się użycie natywnego 64-bitowego kompilatora.

    • Identyfikator biblioteki dla 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 wersji lub identyfikatora lcid, reguły , które są stosowane do progid: są również stosowane do identyfikatora libid:.

    • Plik wykonywalny (.exe).

    • Plik biblioteki (DLL.dll), zawierające zasób biblioteki typów (na przykład .ocx).

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

    • Innym formacie pliku, który może być rozumiany przez LoadTypeLib interfejsu API.

  • attributes
    Jeden lub więcej #import atrybutów.Oddziel atrybuty spacją lub przecinkiem.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 może być opcjonalnie poprzedzona specyfikacją katalogu.Nazwa pliku musi odnosić się do istniejącego pliku.Różnica między dwoma formularzami składni tkwi w kolejności, w której preprocesor szuka plików typu biblioteki, jeśli ścieżka nie jest całkowicie określona.

Forma składni

Akcja

Cytowany formularz

Nakazuje preprocesorowi szukać typów plików biblioteki wpierw w katalogu pliku, który zawiera instrukcję #import, a następnie w katalogach dowolnych plików, które zawierają ten plik (#include).Preprocesor wyszukuje następnie wzdłuż ścieżek przedstawionych poniżej.

Formularz nawias kątowy

Nakazuje preprocesorowi wyszukiwać typy plików biblioteki wzdłuż następującej ścieżki:

  1. ŚCIEŻKA lista ścieżek zmiennej środowiskowej

  2. Lista ścieżki zmiennej środowiskowej LIB

  3. Ścieżka określona przez /I (dodatkowe katalogi dołączenia) opcję kompilatora, z wyjątkiem sytuacji kiedy kompilator szuka biblioteki typów, do której odwołanie pochodzi z innej biblioteki typów z atrybutem no_registry.

Określanie identyfikatora lokalizacji i numeru wersji

Kiedy określasz progid, możesz również określić lokalizację ID i numeru wersji progid.Na przykład:

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

Jeśli nie zostanie określony identyfikator lokalizacji, identyfikator progid jest wybierany zgodnie z następującymi zasadami:

  • Jeśli istnieje tylko jeden identyfikator lokalizacji, ten właśnie jest używany.

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

  • Jeśli istnieje więcej niż jeden identyfikator lokalizacji, a żaden z nich nie jest 0, 9 lub 409, ostatni z nich jest używany.

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

Pliki nagłówkowe utworzone przez import

#import powoduje utworzenie dwóch plików nagłówka, które odtwarzają zawartość biblioteki typów w kodzie źródłowym C++.Plik nagłówka podstawowego jest zbliżony do pliku wytworzonego przez kompilator Microsoft Interface Definition Language (MIDL), ale z dodatkowym wygenerowanym przez kompilator kodem i datą.Plik podstawowego nagłówka ma taką samą nazwę bazy jak biblioteka typów, plus rozszerzenie .THL.Plik podrzędnego nagłówka ma taką samą nazwę bazy jak biblioteka typów, plus rozszerzenie .TLI.Zawiera implementacje dla funkcji elementów członkowskich generowanych przez kompilator i jest zawarty w (#include) w podstawowym pliku nagłówkowym.

W przypadku importowania właściwości dispinterface, która używa parametrów byref, #import nie wygeneruje instrukcji __declspec (właściwość) dla tej funkcji.

Oba pliki nagłówkowe są umieszczone w katalogu wyjściowym określonym przez opcję /Fo (nazwa obiektu pliku).Są następnie odczytywane i kompilowane przez kompilator, tak jakby główny plik nagłówka został nazwany według dyrektywy #include.

Następujące optymalizacje kompilatora pochodzą z dyrektywy #import:

  • Pliku nagłówka podczas tworzenia otrzymuje taki sam znacznik czasu jak biblioteka typów.

  • Kiedy #import jest przetwarzany, kompilator najpierw sprawdza, czy nagłówek istnieje i jest aktualny.Jeśli tak, to nie trzeba odtwarzać.

Dyrektywa #import również uczestniczy w minimalnej odbudowie i może być umieszczona w pliku wstępnie skompilowanego nagłówka.Zobacz Tworzenie prekompilowanych plików nagłówka, aby uzyskać więcej informacji.

Plik nagłówkowy biblioteki typu podstawowego

Podstawowy plik nagłówka biblioteki typów składa się z siedmiu sekcji:

  • Standardowy nagłówek: składa się z komentarzy, instrukcji #include dla COMDEF.H (która określa niektóre standardowe makra używane w nagłówku) i innych informacji o różnych ustawieniach.

  • Prześlij dalej odniesienia i definicje typów: składa się z deklaracji struktury, takich jak struct IMyInterface i definicji typów.

  • Deklaracje sprytnego wskaźnika: szablon klasy _com_ptr_t jest implementacją sprytnego wskaźnika, który hermetyzuje wskaźniki interfejsu i eliminuje konieczność wywołania AddRef, Wydanie, funkcje QueryInterface.Ponadto, ukrywa wywołanie CoCreateInstance w tworzeniu nowego obiektu COM.Ten rozdział wykorzystuje makro instrukcję _COM_SMARTPTR_TYPEDEF,aby ustalić definicje typów interfejsów COM, które mają być specjalizacjami szablonu dla klasy szablonów _com_ptr_t.Na przykład dla interfejsu IMyInterface plik TLH będzie zawierać:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    które kompilator rozszerzy do:

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

    Typ IMyInterfacePtr może być później wykorzystany w miejsce surowego wskaźnika interfejsu IMyInterface*.W konsekwencji nie trzeba wywoływac różnych IUnknown funkcji elementów członkowskich

  • Deklaracje Typeinfo: Składa się głównie z definicji klas i innych elementów ukazujących indywidualne elementy typeinfo zwrócone przez ITypeLib:GetTypeInfo.W tej sekcji, każdy element typeinfo z biblioteki typów znajduje odzwierciedlenie w nagłówku formularza w zależności od informacji TYPEKIND.

  • Opcjonalna definicja w starym stylu identyfikatora GUID: zawiera inicjalizacje nazwanych stałych identyfikatora GUID.Są to nazwy wersji CLSID_CoClass oraz IID_Interface, podobne do tych wygenerowanych przez kompilator MIDL.

  • #include Instrukcja dla nagłówka biblioteki typu pomocniczego.

  • Standardowe stopki: obecnie obejmują #pragma pack(pop).

Wszystkie sekcje, z wyjątkiem szablonowego nagłowka i szablonowe sekcji stopki są ujęte w przestrzeni nazw, z jego nazwą określoną przez biblioteki instrukcji w oryginalnym pliku IDL.Można użyć nazw z nagłówka biblioteki typów albo poprzez jawną kwalifikację z nazwą przestrzeni nazw albo załączając następującą instrukcję:

using namespace MyLib;

natychmiast po instrukcji #import w kodzie źródłowym.

Obszar nazw może być pominięty przy użyciu atrybutu no_namespace dyrektywy #import.Jednakże pomijanie przestrzeni nazw może prowadzić do konfliktów nazw.Ponadto można zmienić nazwę obszaru nazw używając atrybutu rename_namespace.

Kompilator zapewnia pełną ścieżkę do dowolnego typu zależności biblioteki wymaganego przez bibliotekę typu, którą aktualnie przetwarza.Ścieżka jest zapisana w formie komentarzy w nagłówku biblioteki typów (.TLH), generowanej przez kompilator dla każdej przetworzonej biblioteki typów.

Jeśli biblioteka typów zawiera odwołania do typów zdefiniowanych w innych bibliotekach typu, plik .TLH będzie zawierać komentarze w rodzaju:

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

Rzeczywista nazwa pliku w komentarzu #import jest pełną ścieżką biblioteki typów odsyłaczy, przechowywaną w rejestrze.Jeśli wystąpią błędy z powodu braku definicji typu, należy sprawdzić komentarze w nagłówku .TLH, aby zobaczyć zależne typy bibliotek, które w pierwszej kolejności mogą wymagać importu.Prawdopodobne błędy są błędami składni (na przykład, C2143, C2146, C2321), C2501 (brak specyfikatorów decl) lub C2433 (deklaracja „inline” nie jest dozwolona dla zgłaszania danych) podczas kompilacji pliku .TLI.

Należy określić, które z komentarzy zależności nie zostały inaczej dostarczone przez nagłówki systemu, a potem dostarczyć dyrektywę #import w którymś momencie przed dyrektywą #import biblioteki zależnego typu do rozwiązania błędów.

Aby uzyskać więcej informacji, zobacz artykuł w bazie wiedzy "Metody otoki #import mogą spowodować nieupoważniony dostęp" (Q242527) lub "Błędy kompilatora podczas korzystania z #import i XML" (Q269194).Możesz znaleźć artykuły bazy wiedzy na nośnikach biblioteki MSDN lub na stronie https://support.microsoft.com/support/.

Atrybuty #import

#import Opcjonalnie można dodać jeden lub kilka atrybutów.Te atrybuty każą kompilatorowi modyfikować zawartość nagłówków biblioteki typów.Ukośnik odwrotny (\) symbolu można uwzględnić dodatkowe wiersze w jednym #import instrukcji.Na przykład:

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

Aby uzyskać więcej informacji, zobacz Atrybuty #import (C++).

KONIEC określonego języka C++

Zobacz też

Informacje

Dyrektywy preprocesora

Obsługa kompilatora COM