direktiva #import (C++)

Specifické pro C++

Slouží k začlenění informací z knihovny typů. Obsah knihovny typů je převeden na třídy C++, většinou popisující rozhraní MODELU COM.

Syntaxe

#import "název_souboru" [atributy]
<#import název souboru> [atributy]

Parametry

Název_souboru
Určuje knihovnu typů, která se má importovat. Název souboru může být jeden z následujících typů:

  • Název souboru, který obsahuje knihovnu typů, například soubor .olb, .tlb nebo .dll. Klíčové slovo, file:může předcházet každému názvu souboru.

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

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

    Další informace ogids naleznete v tématu Určení ID lokalizace a číslo verze.

    Při použití 32bitového křížového kompilátoru v 64bitovém operačním systému může kompilátor číst pouze 32bitový podregistr registru. K sestavení a registraci 64bitové knihovny typů můžete použít nativní 64bitový kompilátor.

  • 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 version nebo lcid, použijí se také pravidla použitá progid: na libid:.

  • Spustitelný soubor (.exe).

  • Soubor knihovny (.dll) obsahující prostředek knihovny typů (například .ocx).

  • Složený dokument obsahující knihovnu typů

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

Atributy
Jeden nebo více atributů #import. Oddělte atributy mezerou nebo čárkou. 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í pro název souboru

název souboru je volitelně před specifikací adresáře. Název souboru musí pojmenovat existující soubor. Rozdíl mezi těmito dvěma formuláři syntaxe je pořadí, ve kterém preprocesor hledá soubory knihovny typů, pokud je cesta neúplně zadaná.

Formulář syntaxe Akce
Formulář s citacemi Dává preprocesoru pokyn, aby nejprve hledal soubory knihovny typů v adresáři souboru, který obsahuje příkaz #import , a potom v adresářích souborů, které tento soubor obsahují (#include). Preprocesor pak vyhledá podél níže uvedených cest.
Tvar úhlové závorky Dává preprocesoru pokyn, aby hledal soubory knihovny typů podle následujících cest:

1. Seznam PATH cest proměnných prostředí
2. Seznam LIB cest proměnných prostředí
3. Cesta zadaná možností kompilátoru /I s výjimkou kompilátoru hledá knihovnu typů odkazovanou z jiné knihovny typů s atributem no_registry .

Zadejte ID lokalizace a číslo verze.

Když zadáte identifikátor progid, můžete také zadat ID lokalizace a číslo verzegid. Příklad:

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

Pokud nezadáte ID lokalizace, zvolí segid podle následujících pravidel:

  • Pokud existuje pouze jedno ID lokalizace, použije se toto ID.

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

  • Pokud existuje více než jedno ID lokalizace a žádné z nich není 0, 9 nebo 409, použije se poslední.

  • Pokud nezadáte číslo verze, použije se nejnovější verze.

Soubory hlaviček vytvořené importem

#import vytvoří dva soubory hlaviček, které rekonstruuje obsah knihovny typů ve zdrojovém kódu jazyka C++. Primární hlavičkový soubor je podobný souboru vytvořenému kompilátorem MIDL (Microsoft Interface Definition Language), ale s dalšími kódy a daty generovaným kompilátorem. Primární hlavičkový soubor má stejný základní název jako knihovna typů a navíc . Rozšíření TLH. Sekundární soubor hlaviček má stejný základní název jako knihovna typů s příponou . Rozšíření TLI. Obsahuje implementace pro členské funkce generované kompilátorem a je zahrnut (#include) v primárním souboru hlaviček.

Pokud importuje vlastnost dispinterface, která používá byref parametry, #import negeneruje příkaz __declspec(vlastnost) pro funkci.

Oba soubory hlaviček se umístí do výstupního adresáře určeného možností /Fo (název souboru objektu). Pak se čtou a kompilují kompilátorem, jako by primární hlavičkový soubor pojmenoval direktiva #include .

Následující optimalizace kompilátoru jsou součástí direktivy #import :

  • Při vytvoření se souboru záhlaví zobrazí stejné časové razítko jako knihovna typů.

  • Při zpracování #import kompilátor nejprve zkontroluje, jestli záhlaví existuje a je aktuální. Pokud ano, není potřeba ho znovu vytvořit.

Direktiva #import se také podílí na minimálním opětovném sestavení a lze ji umístit do předkompilovaného hlavičkového souboru. Další informace naleznete v tématu Vytváření předkompilovaných souborů hlaviček.

Soubor hlaviček knihovny primárního typu

Soubor hlaviček primární knihovny typů se skládá ze sedmi oddílů:

  • Často používaný nadpis: Skládá se z komentářů, #include příkaz pro COMDEF. H (které definuje některá standardní makra použitá v záhlaví) a další různé informace o nastavení.

  • Předávání odkazů a typedefs: Skládá se z deklarací struktury, jako struct IMyInterface jsou a typedefs.

  • Deklarace inteligentních ukazatelů: Třída _com_ptr_t šablony je inteligentní ukazatel. Zapouzdřuje ukazatele rozhraní a eliminuje potřebu volat AddRef, Releasea QueryInterface funkce. Také skryje CoCreateInstance volání při vytváření nového objektu COM. Tato část používá příkaz _COM_SMARTPTR_TYPEDEF makra k vytvoření typedefs rozhraní MODELU COM jako specializace šablony _com_ptr_t třídy šablony. Například pro rozhraní IMyInterface, . Soubor TLH bude obsahovat:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    které kompilátor rozbalí na:

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

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

  • Deklarace Typeinfo: Primárně se skládá z definic tříd a dalších položek, které zveřejňují jednotlivé položky typeinfo vrácené ITypeLib:GetTypeInfo. V této části se každá informace o typech z knihovny typů projeví v záhlaví ve formuláři závislém na informacích TYPEKIND .

  • Volitelná definice identifikátoru GUID starého stylu: Obsahuje inicializace pojmenovaných konstant GUID. Tyto názvy mají formulář CLSID_CoClass a IID_Interfacepodobně jako názvy vygenerované kompilátorem MIDL.

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

  • Zápatí: V současné době zahrnuje #pragma pack(pop).

Všechny oddíly s výjimkou často používané části nadpisu a zápatí jsou uzavřeny v oboru názvů s jeho názvem určeným library příkazem v původním souboru IDL. Názvy z hlavičky knihovny typů můžete použít explicitní kvalifikací pomocí názvu oboru názvů. Nebo můžete zahrnout následující příkaz:

using namespace MyLib;

bezprostředně za příkazem #import ve zdrojovém kódu.

Obor názvů lze potlačit pomocí atributu no_namespace) direktivy #import . Potlačení oboru názvů ale může vést ke kolizím názvů. Obor názvů lze také přejmenovat atributem rename_namespace .

Kompilátor poskytuje úplnou cestu k jakékoli závislosti knihovny typů vyžadované knihovnou typů, kterou právě zpracovává. Cesta se zapíše ve formě komentářů do hlavičky knihovny typů (. TLH), který kompilátor generuje pro každou zpracovanou knihovnu typů.

Pokud knihovna typů obsahuje odkazy na typy definované v jiných knihovnách typů, pak . Soubor TLH bude obsahovat komentáře tohoto řazení:

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

Skutečný název souboru v komentáři #import je úplná cesta knihovny typů křížového odkazu, která je uložena v registru. Pokud dojde k chybám způsobeným chybějícími definicemi typů, zkontrolujte komentáře v záhlaví . TLH, abyste viděli, které knihovny závislých typů možná bude potřeba nejprve importovat. Pravděpodobné chyby jsou chyby syntaxe (například C2143, C2146, C2321), C2501 (chybějící specifikátory decl-specifikátory) nebo C2433 ("vložené" nejsou povoleny pro deklaraci dat) při kompilaci . TLI soubor.

Pokud chcete vyřešit chyby závislostí, určete, které komentáře závislostí nejsou jinak poskytovány hlavičkami systému, a pak v určitém okamžiku před direktivou #import závislé knihovny typů zadejte direktivu #import.

atributy #import

#import může volitelně obsahovat jeden nebo více atributů. Tyto atributy kompilátoru říkají, aby upravil obsah hlaviček knihovny typů. Symbol zpětného lomítka (\) lze použít k zahrnutí dalších řádků do jednoho příkazu #import . Příklad:

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

Další informace najdete v tématu #import atributy.

Specifické pro END C++

Viz také

Direktivy preprocesoru
Podpora modelu COM kompilátoru