Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
versionellerlcidtillä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övariabler2. Listan LIB över sökvägar för miljövariabler3. 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,
#includeinstruktion 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 IMyInterfaceoch typedefs.Smarta pekardeklarationer: Mallklassen
_com_ptr_tär en smart pekare. Den kapslar in gränssnittspekare och eliminerar behovet av att anropaAddRef,ReleaseochQueryInterfacefunktioner. Det döljer också anropetCoCreateInstancenär du skapar ett nytt COM-objekt. I det här avsnittet används makrosatsen_COM_SMARTPTR_TYPEDEFför att upprätta typedefs av COM-gränssnitt som mallspecialiseringar för _com_ptr_t-mallklassen. Till exempel för gränssnittetIMyInterface, . 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
IMyInterfacePtrkan sedan användas i stället för den råa gränssnittspekarenIMyInterface*. Därför behöver du inte anropa de olikaIUnknownmedlemsfunktionernaTypeinfo-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 avTYPEKINDinformationen.Valfri guid-definition i gammal stil: Innehåller initieringar av de namngivna GUID-konstanterna. Dessa namn har formuläret
CLSID_CoClassochIID_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