Dela via


#import direktiv (C++)

C++ Specifik

Används för att införliva information från ett typbibliotek. Innehållet i typbiblioteket konverteras till C++-klasser, vilket främst beskriver COM-gränssnitten.

Syntax

#import "filename" [attribut]
<#importfilnamn> [attribut]

Parameterar

filnamn
Anger typbiblioteket som ska importeras. Filnamnet kan vara en av följande typer:

  • Namnet på en fil som innehåller ett typbibliotek, till exempel en .olb-, .tlb- eller .dll-fil. Nyckelordet , file:kan föregå varje filnamn.

  • En kontrolls progid i typbiblioteket. Nyckelordet , progid:kan föregå varje progid. Till exempel:

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

    Mer information om progids finns i Ange lokaliserings-ID och versionsnummer.

    När du använder en 32-bitars korskompilator på ett 64-bitars operativsystem kan kompilatorn bara läsa 32-bitars registerdatafilen. Du kanske vill använda den inbyggda 64-bitars kompilatorn för att skapa och registrera ett 64-bitarsbibliotek.

  • Biblioteks-ID:t för typbiblioteket. Nyckelordet , libid:kan föregå varje biblioteks-ID. Till exempel:

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

    Om du inte anger version eller lcidtillämpas även de regler som tillämpas på progid:libid:på .

  • En körbar fil (.exe).

  • En biblioteksfil (.dll) som innehåller en typbiblioteksresurs (till exempel en .ocx).

  • Ett sammansatt dokument som innehåller ett typbibliotek.

  • Alla andra filformat som kan förstås av LoadTypeLib-API :et.

attribut
Ett eller flera #import attribut. Avgränsa attribut med antingen ett blanksteg eller kommatecken. Till exempel:

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

-eller-

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

Anmärkningar

Sökordning för filnamn

filnamn föregås eventuellt av en katalogspecifikation. Filnamnet måste namnge en befintlig fil. Skillnaden mellan de två syntaxformulären är den ordning i vilken förprocessorn söker efter typbiblioteksfilerna när sökvägen har angetts ofullständigt.

Syntaxformulär Åtgärd
Angiven form Instruerar förprocessorn att först söka efter typbiblioteksfiler i katalogen för filen som innehåller #import-instruktionen och sedan i katalogerna för de filer som innehåller (#include) filen. Förprocessorn söker sedan längs sökvägarna som visas nedan.
Vinkelparentesform Instruerar förprocessorn att söka efter typbiblioteksfiler längs följande sökvägar:

1. Listan PATH över sökvägar för miljövariabler
2. Listan LIB över sökvägar för miljövariabler
3. Sökvägen som anges av kompilatoralternativet /I , förutom att kompilatorn söker efter ett typbibliotek som refererades från ett annat typbibliotek med attributet no_registry .

Ange lokaliserings-ID och versionsnummer

När du anger en progid kan du också ange lokaliserings-ID och versionsnummer för progid. Till exempel:

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

Om du inte anger något lokaliserings-ID väljs en progid enligt följande regler:

  • Om det bara finns ett lokaliserings-ID används det.

  • Om det finns fler än ett lokaliserings-ID används det första med versionsnummer 0, 9 eller 409.

  • Om det finns fler än ett lokaliserings-ID och ingen av dem är 0, 9 eller 409 används den sista.

  • Om du inte anger ett versionsnummer används den senaste versionen.

Rubrikfiler som skapats genom import

#import skapar två huvudfiler som rekonstruerar innehållet i typbiblioteket i C++-källkoden. Den primära huvudfilen liknar den som skapas av MIDL-kompilatorn (Microsoft Interface Definition Language), men med ytterligare kompilatorgenererad kod och data. Den primära huvudfilen har samma basnamn som typbiblioteket, plus en . TLH-tillägg. Den sekundära huvudfilen har samma basnamn som typbiblioteket, med en . TLI-tillägg. Den innehåller implementeringarna för kompilatorgenererade medlemsfunktioner och ingår (#include) i den primära huvudfilen.

Om du importerar en dispinterface-egenskap som använder byref parametrar genererar #import inte någon __declspec-instruktion (egenskap) för funktionen.

Båda huvudfilerna placeras i utdatakatalogen som anges av alternativet /Fo (namnobjektfil). De läss och kompileras sedan av kompilatorn som om den primära huvudfilen namngavs av ett #include direktiv.

Följande kompilatoroptimeringar följer med #import-direktivet :

  • Rubrikfilen, när den skapas, får samma tidsstämpel som typbiblioteket.

  • När #import bearbetas kontrollerar kompilatorn först om huvudet finns och är up-to-date. Om ja, behöver den inte återskapas.

#import-direktivet deltar också i minimal ombyggnad och kan placeras i en fördefinierad rubrikfil. Mer information finns i Skapa förkompilerade huvudfiler.

Huvudfil för primär typbibliotek

Huvudfilen för huvudfilen för den primära typen av bibliotek består av sju avsnitt:

  • Rubrik pannplåt: Består av kommentarer, #include instruktion för COMDEF. H (som definierar vissa standardmakron som används i rubriken) och annan övrig konfigurationsinformation.

  • Vidarebefordra referenser och typedefs: Består av strukturdeklarationer som struct IMyInterface och typedefs.

  • Smarta pekardeklarationer: Mallklassen _com_ptr_t är en smart pekare. Den kapslar in gränssnittspekare och eliminerar behovet av att anropa AddRef, Releaseoch QueryInterface funktioner. Det döljer också anropet CoCreateInstance när du skapar ett nytt COM-objekt. I det här avsnittet används makrosatsen _COM_SMARTPTR_TYPEDEF för att upprätta typedefs av COM-gränssnitt som mallspecialiseringar för _com_ptr_t-mallklassen. Till exempel för gränssnittet IMyInterface, . TLH-filen innehåller:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    som kompilatorn expanderar till:

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

    Typen IMyInterfacePtr kan sedan användas i stället för den råa gränssnittspekaren IMyInterface*. Därför behöver du inte anropa de olika IUnknown medlemsfunktionerna

  • Typeinfo-deklarationer: Består främst av klassdefinitioner och andra objekt som exponerar de enskilda typeinfo-objekten som returneras av ITypeLib::GetTypeInfo. I det här avsnittet återspeglas varje typeinfo från typbiblioteket i rubriken i ett formulär som är beroende av TYPEKIND informationen.

  • Valfri guid-definition i gammal stil: Innehåller initieringar av de namngivna GUID-konstanterna. Dessa namn har formuläret CLSID_CoClass och IID_Interface, ungefär som de som genereras av MIDL-kompilatorn.

  • #include -instruktion för bibliotekshuvudet av sekundär typ.

  • Pannplatta för sidfot: Innehåller #pragma pack(pop)för närvarande .

Alla avsnitt, förutom rubriken boilerplate och footer boilerplate section, omges av ett namnområde med dess namn som anges av -instruktionen library i den ursprungliga IDL-filen. Du kan använda namnen från typbiblioteksrubriken med en explicit kvalificering med namnområdesnamnet. Eller så kan du inkludera följande instruktion:

using namespace MyLib;

omedelbart efter #import-instruktionen i källkoden.

Namnområdet kan ignoreras med hjälp av attributet no_namespace) i #import-direktivet . Att utelämna namnområdet kan dock leda till namnkollisioner. Namnområdet kan också byta namn på attributet rename_namespace .

Kompilatorn tillhandahåller den fullständiga sökvägen till alla typer av biblioteksberoenden som krävs av typbiblioteket som bearbetas för närvarande. Sökvägen skrivs i form av kommentarer till typbiblioteksrubriken (. TLH) som kompilatorn genererar för varje bearbetat typbibliotek.

Om ett typbibliotek innehåller referenser till typer som definierats i andra typbibliotek, kommer . TLH-filen innehåller kommentarer av följande slag:

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

Det faktiska filnamnet i kommentaren #import är den fullständiga sökvägen till det korsreferensbibliotek som lagras i registret. Om du stöter på fel som orsakas av saknade typdefinitioner kontrollerar du kommentarerna i huvudet på . TLH för att se vilka beroende typbibliotek som kan behöva importeras först. Troliga fel är syntaxfel (till exempel C2143, C2146, C2321), C2501 (saknade decl-specifiers) eller C2433 ("infogad" tillåts inte för datadeklaration) när du kompilerar . TLI-fil.

Lös beroendefel genom att fastställa vilka av beroendekommentarna som annars inte tillhandahålls av systemhuvuden och sedan ange ett #import-direktiv någon gång före #import-direktivet för biblioteket av beroende typ.

#import attribut

#import kan innehålla ett eller flera attribut. De här attributen instruerar kompilatorn att ändra innehållet i typbibliotekshuvudena. En omvänt snedstreckssymbol (\) kan användas för att inkludera ytterligare rader i en enda #import-instruktion . Till exempel:

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

Mer information finns i #import attribut.

END C++ Specifik

Se även

Direktiv för förprocessorer
Com-stöd för kompilator