Sdílet prostřednictvím


#import – direktiva (C++)

Specifické pro C++

Používá se k opatření informací z knihovny typů.Obsah typu knihovny je převeden na třídy jazyka C++, převážně popisující rozhraní COM.

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

Parametry

  • název souboru
    Určuje typ knihovny, který chcete importovat.filename může být jeden z následujících:

    • Název souboru, který obsahuje knihovnu typů, jako je například soubor OLB, TLB nebo DLL.Klíčové slovo file: může předcházet každý název souboru.

    • Progid ovládacího prvku v knihovně typů.Klíčové slovo progid: může předcházet každý parametr progid.Příklad:

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

      Další informace o identifikátorech ProgID, viz Určení ID lokalizace a číslo verze.

      Všimněte si, že při kompilaci s křížovým kompilátorem v 64bitovém operačního systému bude kompilátor schopen číst pouze 32bitové podregistry.Můžete chtít používat nativní 64bitový kompilátor pro sestavení a registrací knihovny 64bitového typu.

    • ID knihovny typů.Klíčové slovo libid: může předcházet každé ID knihovny.Příklad:

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

      Pokud neurčíte verzi nebo lcid, pravidla, která jsou použita na progid:, jsou použita také na libid.

    • Spustitelný soubor (EXE).

    • Soubor knihovny (DLL) obsahující zdroj knihovny typů (například OCX).

    • Složený dokument s knihovnou typů.

    • Jakýkoli jiný formát souboru, kterému rozumí rozhraní API LoadTypeLib.

  • attributes
    Jeden nebo více atributů #import.Samostatné atributy s mezerami nebo čárkami.Příklad:

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

    -nebo-

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

Poznámky

Pořadí hledání názvů souborů

názvu souboru může volitelně předcházet specifikace adresáře.Název souboru musí být název existujícího souboru.Rozdíl mezi dvěma formuláři syntaxe je v pořadí, ve kterém preprocesor hledá soubory s knihovnami typu v případě, kdy je cesta zadána neúplně.

Forma syntaxe

Akce

Citovaný formulář

Vydá pokyn preprocesoru k vyhledání nejprve typů souborů knihoven v adresáři souboru, který obsahuje výraz #import a poté v adresářích s ostatními soubory, které daný soubor obsahují (#include).Preprocesor pak bude hledat podél cest, které jsou zobrazeny v následujícím obrázku.

Forma lomené závorky

Vydá pokyn preprocesoru k vyhledání typu souborů knihoven v následujících umístěních:

  1. Seznam proměnných cest prostředí PATH

  2. Seznam proměnných cest prostředí LIB

  3. Cesta zadaná pomocí možnosti kompilátoru /I (zahrnout další adresáře), kromě toho kompilátor bude hledat knihovnu typů, která byla popsána z jiné knihovny typů s atributem no_registry.

Určení ID lokalizace a čísla verze

Při zadávání progid můžete určit také ID lokalizace a číslo verze progid.Příklad:

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

Pokud není zadán Identifikátor lokalizace, progid je zvolena podle následujících pravidel:

  • Pokud existuje pouze jedno ID lokalizace, používá se.

  • Pokud existuje více než jeden ID lokalizace a použije se ten první s číslem verze 0 a 9 nebo 409.

  • Pokud existuje více než jeden ID lokalizace a žádný z nich není 0 a 9 ani 409, použije se ten poslední.

  • Pokud nezadáte číslo verze, bude použita poslední verze.

Hlavičkové soubory vytvořené pomocí importu

Direktiva #import vytvoří dva soubory hlaviček, které rekonstruují obsah knihovny typů ve zdrojovém kódu C++.Primární soubor záhlaví je podobný vyrobenému pomocí kompilátoru MIDL (Microsoft Interface Definition Language), ale s dalším kódem vygenerovaným kompilátorem a daty.Primární záhlaví souboru má stejný základní název knihovny typů, plus rozšíření .TLH.Sekundární záhlaví souboru má stejný základní název knihovna typů s rozšířením .TLI.Obsahuje implementace pro kompilátorem generované členské funkce a je součástí (#include) v primárním souboru záhlaví.

Pokud importujete vlastnost dispinterface, která používá parametr ByRef, #import nevygeneruje příkaz __declspec (vlastnost) funkce.

Oba hlavičkové soubory jsou umístěny ve výstupním adresáři určeném možností /Fo (soubor objektu názvu).Jsou pak čteny a zkompilovány kompilátorem, jako by byl soubor primárního záhlaví pojmenován směrnicí #include.

Součástí následující optimalizace kompilátoru je směrnice #import:

  • Soubor s hlavičkou má při vytvoření stejné časové razítko, jako knihovna typů.

  • Při zpracování #import kompilátor nejprve zkontroluje, zda záhlaví existuje a je aktuální.Pokud ano, pak nemusí být znovu vytvořen.

Direktiva #import se také účastní minimálního opětovného sestavení a lze ji umístit v předkompilovaném hlavičkovém souboru.Další informace viz Vytváření předkompilovaných hlavičkových souborů.

Hlavičkový soubor pro primární typ knihovny

Primární typ záhlaví knihovny se skládá ze sedmi částí:

  • Často používaný text nadpisu: Tvořen komentáři, příkazem #include za COMDEF.H (definující některá standardní makra použitá v záhlaví) a další informace o různých nastaveních.

  • Dopředné odkazy a funkce TypeDef se skládají ze struktur deklarací jako struct IMyInterface a funkce TypeDef.

  • Deklarace inteligentního ukazatele: Třída šablony _com_ptr_t představuje implementaci inteligentního ukazatele, který zapouzdřuje ukazatele rozhraní a eliminuje nutnost volání AddRef, Verze nebo funkce QueryInterface.Navíc skryje volání CoCreateInstance při vytvoření nového objektu COM.Tento oddíl používá příkaz Makro _COM_SMARTPTR_TYPEDEF k vytvoření funkcí typedef rozhraní modelu COM, aby byly specializovanými šablonami šablony třídy _com_ptr_t.Například pro rozhraní IMyInterface bude soubor .TLH obsahovat:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    který kompilátor bude rozbalen do:

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

    Typ IMyInterfacePtr lze použít namísto nezpracovaného ukazatele rozhraní IMyInterface*.V důsledku toho není nutné volat různé členské funkce IUnknown

  • Deklarace typeinfo: Primárně se skládá z definic tříd a ostatních položek vystavovaných individuálním položkám typeinfo vrácených z ITypeLib:GetTypeInfo.V této části se každá vlastnost typeinfo z knihovny typů odráží v záhlaví ve formě závislé na informaci TYPEKIND.

  • Volitelné definice GUID podle původního stylu: obsahuje inicializaci pojmenovaných konstant identifikátoru GUID.Jedná se o názvy formuláře CLSID_CoClass a IID_Interface, podobné těm, které jsou generovány v kompilátoru MIDL.

  • Příkaz #include pro sekundární hlavičku knihovny typů.

  • Často používaný text zápatí: Nyní zahrnuje #pragma pack(pop).

Všechny oddíly s výjimkou často používaného textu nadpisu a často používaného textu zápatí jsou uzavřeny v oboru názvů určeném příkazem library v původním souboru IDL.Můžete použít názvy v záhlaví typu knihovny k explicitní kvalifikaci s oborem názvů nebo zahrnutím následujícího příkazu:

using namespace MyLib;

ihned po příkazu #import ve zdrojovém kódu.

Obor názvů lze potlačit pomocí atributu no_namespace směrnice #import.Nicméně potlačení oboru názvů může vést ke kolizi názvů.Obor názvů lze také přejmenovat atributem rename_namespace.

Kompilátor poskytuje úplnou cestu k libovolné závislosti knihovny, kterou právě zpracovávaná knihovna typů vyžaduje.Cesta je zapsána ve formě komentářů do záhlaví typu knihovny (.TLH), aby se kompilátor vygeneroval pro každou zpracovanou knihovnu typů.

Pokud knihovna typů obsahuje odkazy na typy definované v jiných knihovnách typů, pak bude .TLH soubor obsahovat komentáře následujícího druhu:

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

Skutečný název souboru v komentáři #import představuje úplnou cestu ke knihovně s křížovými odkazy v podobě, v jaké jsou uvedeny v registru.Pokud se vyskytnou chyby, které jsou z důvodu chybějící definice typu, zkontrolujte poznámky v čele .TLH, a zobrazte tak závislé knihovny typů, které bude pravděpodobně nutné nejprve importovat.Pravděpodobné chyby jsou chyby syntaxe (například C2143, C2146, C2321), C2501 (chybí specifikátory decl) nebo C2433 („vložené“ nejsou u dat deklarace povoleny) při kompilaci souboru TLI.

Je třeba určit, které komentáře závislost nejsou jinak poskytovány pro záhlaví systému a poté poskytnout direktivu #import v určitém okamžiku před tím než direktiva #import vyřeší chyby závislého typu knihovny.

Další informace naleznete v článku znalostní báze Knowledge Base "Obálková metoda #import může způsobit narušení přístupu" (Q242527) nebo "Chyby kompilátoru při použití #import s XML" (Q269194).Články znalostní báze můžete vyhledat na médiu knihovny MSDN nebo na adresehttps://support.microsoft.com/?ln=cs.

Atributy #import

Direktiva #import může volitelně zahrnovat jeden nebo více atributů.Tyto atributy oznamují kompilátoru, že má upravit obsah záhlaví knihovny typů.Zpětné lomítko (\) lze použít k zahrnutí dalších řádků do jediného příkazu #import.Příklad:

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

Další informace naleznete v tématu #import – atributy (C++).

Specifické pro END C++

Viz také

Referenční dokumentace

Preprocesor – direktivy

Podpora kompilátoru modelu COM