direttiva #import (C++)
Specifiche di C++
Utilizzato per incorporare le informazioni di una libreria dei tipi. Il contenuto della libreria dei tipi viene convertito in classi C++ che descrivono principalmente le interfacce COM.
Sintassi
#import "filename" [attributes]
<#import nome file> [attributi]
Parametri
filename
Specifica la libreria dei tipi da importare. Il nome file può essere uno dei tipi seguenti:
Il nome di un file contenente una libreria dei tipi, ad esempio un file OLB, TLB o DLL. La parola chiave ,
file:
, può precedere ogni nome file.Il ProgID di un controllo nella libreria dei tipi. La parola chiave ,
progid:
, può precedere ogni progid. Ad esempio:#import "progid:my.prog.id.1.5"
Per altre informazioni sui progid, vedere Specifica dell'ID di localizzazione e del numero di versione.
Quando si usa un compilatore incrociato a 32 bit in un sistema operativo a 64 bit, il compilatore può leggere solo l'hive del Registro di sistema a 32 bit. È possibile utilizzare il compilatore a 64 bit nativo per compilare e registrare una libreria dei tipi a 64 bit.
ID di libreria della libreria dei tipi. La parola chiave ,
libid:
, può precedere ogni ID di libreria. Ad esempio:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
Se non si specifica
version
olcid
, le regole applicate aprogid:
vengono applicate anche alibid:
.Un file eseguibile (EXE).
Un file di libreria (.dll) contenente una risorsa libreria dei tipi (ad esempio un file con estensione ocx).
Un documento composito contenente una libreria dei tipi.
Qualsiasi altro formato di file che può essere compreso dall'API LoadTypeLib .
attributes
Uno o più attributi #import. Separare gli attributi con uno spazio o una virgola. Ad esempio:
#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
oppure
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
Osservazioni:
Ordine di ricerca per il nome file
filename è facoltativamente preceduto da una specifica di directory. Il nome file deve essere il nome di un file esistente. La differenza tra le due forme di sintassi è costituita dall'ordine in cui il preprocessore cerca i file della libreria dei tipi quando il percorso è specificato in modo incompleto.
Forma di sintassi | Azione |
---|---|
Formato con virgolette | Indica al preprocessore di cercare prima i file della libreria dei tipi nella directory del file che contiene l'istruzione #import e quindi nelle directory dei file che includono (#include ) tale file. Il preprocessore effettua quindi la ricerca nei percorsi indicati di seguito. |
Formato con parentesi angolari | Indica al preprocessore di cercare i file della libreria dei tipi nei percorsi seguenti: 1. Elenco dei percorsi delle PATH variabili di ambiente2. Elenco dei percorsi delle LIB variabili di ambiente3. Il percorso specificato dall'opzione del compilatore /I , ad eccezione del compilatore cerca una libreria dei tipi a cui è stato fatto riferimento da un'altra libreria dei tipi con l'attributo no_registry . |
Specificare l'ID di localizzazione e il numero di versione
Quando si specifica un ProgID, è anche possibile specificare i relativi ID di localizzazione e numero di versione. Ad esempio:
#import "progid:my.prog.id" lcid("0") version("4.0)
Se non si specifica un ID di localizzazione, viene scelto un progid in base alle regole seguenti:
Se è presente un solo ID di localizzazione, ne viene usato uno.
Se sono presenti più ID di localizzazione, viene usato il primo con numero di versione 0, 9 o 409.
Se sono presenti più ID di localizzazione e nessuno di essi è 0, 9 o 409, viene usato l'ultimo.
Se non si specifica un numero di versione, viene usata la versione più recente.
File di intestazione creati dall'importazione
#import crea due file di intestazione che ricostruiscono il contenuto della libreria dei tipi nel codice sorgente C++. Il file di intestazione primario è simile a quello prodotto dal compilatore MIDL (Microsoft Interface Definition Language), ma con codice e dati aggiuntivi generati dal compilatore. Il file di intestazione primario ha lo stesso nome di base della libreria dei tipi, oltre a . Estensione TLH. Il file di intestazione secondario è costituito dallo stesso nome di base della libreria dei tipi seguito dall'estensione TLI. Contiene le implementazioni per le funzioni membro generate dal compilatore ed è incluso (#include
) nel file di intestazione principale.
Se si importa una proprietà dispinterface che usa byref
parametri, #import non genera un'istruzione __declspec(property) per la funzione.
Entrambi i file di intestazione vengono inseriti nella directory di output specificata dall'opzione /Fo (file dell'oggetto nome). Vengono quindi letti e compilati dal compilatore come se il file di intestazione primario fosse denominato da una #include
direttiva.
Le ottimizzazioni del compilatore seguenti includono la direttiva #import :
Al momento della creazione, al file di intestazione viene assegnato lo stesso timestamp della libreria dei tipi.
Quando #import viene elaborato, il compilatore controlla innanzitutto se l'intestazione esiste ed è aggiornata. In caso affermativo, non è necessario crearne di nuovo.
La direttiva #import partecipa anche alla ricompilazione minima e può essere inserita in un file di intestazione precompilato. Per altre informazioni, vedere Creazione di file di intestazione precompilati.
File di intestazione della libreria dei tipi primario
Il file di intestazione principale della libreria dei tipi è costituito da sette sezioni:
Boilerplate di intestazione: include i commenti, l'istruzione
#include
per COMDEF.H (che definisce alcune macro standard utilizzate nell'intestazione) e altre informazioni varie sull'installazione.Riferimenti in avanti e typedef: includono le dichiarazioni di struttura come
struct IMyInterface
e typedef.Dichiarazioni di puntatore intelligente: la classe
_com_ptr_t
modello è un puntatore intelligente. Incapsula i puntatori di interfaccia ed elimina la necessità di chiamareAddRef
le funzioni ,Release
eQueryInterface
. Nasconde inoltre la chiamata durante laCoCreateInstance
creazione di un nuovo oggetto COM. In questa sezione viene utilizzata l'istruzione_COM_SMARTPTR_TYPEDEF
macro per stabilire i typedef delle interfacce COM come specializzazioni di modello della classe modello _com_ptr_t . Ad esempio, per l'interfacciaIMyInterface
, . Il file TLH conterrà:_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
in cui si espanderà il compilatore:
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
Il tipo
IMyInterfacePtr
può essere quindi utilizzato al posto del puntatore a interfaccia rawIMyInterface*
. Di conseguenza, non è necessario chiamare le varieIUnknown
funzioni membroDichiarazioni typeinfo: principalmente è costituito da definizioni di classe e altri elementi che espongono i singoli elementi typeinfo restituiti da
ITypeLib:GetTypeInfo
. In questa sezione, ogni elemento typeinfo della libreria dei tipi si riflette nell'intestazione in un formato che dipende dalle informazioniTYPEKIND
.Definizione di GUID obsoleta facoltativa: contiene le inizializzazioni delle costanti GUID denominate. Questi nomi hanno il formato
CLSID_CoClass
eIID_Interface
, simile a quelli generati dal compilatore MIDL.Istruzione
#include
per l'intestazione secondaria della libreria dei tipi.Boilerplate del piè di pagina: attualmente include
#pragma pack(pop)
.
Tutte le sezioni, ad eccezione della sezione boilerplate e boilerplate del piè di pagina, sono racchiuse in uno spazio dei nomi con il nome specificato dall'istruzione library
nel file IDL originale. È possibile usare i nomi dell'intestazione della libreria dei tipi usando il nome dello spazio dei nomi. In alternativa, è possibile includere l'istruzione seguente:
using namespace MyLib;
subito dopo l'istruzione #import nel codice sorgente.
Lo spazio dei nomi può essere eliminato utilizzando l'attributo no_namespace) della direttiva #import . Tuttavia, l'eliminazione dello spazio dei nomi può causare conflitti di nomi. Lo spazio dei nomi può anche essere rinominato dall'attributo rename_namespace .
Il compilatore fornisce il percorso completo di qualsiasi dipendenza della libreria dei tipi richiesta dalla libreria dei tipi attualmente in fase di elaborazione. Il percorso viene scritto, sotto forma di commenti, nell'intestazione della libreria dei tipi (TLH) generata dal compilatore per ogni libreria dei tipi elaborata.
Se una libreria dei tipi include riferimenti ai tipi definiti in altre librerie dei tipi, il file con estensione THL includerà commenti del seguente tipo:
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
Il nome file effettivo nel commento #import è il percorso completo della libreria dei tipi a cui viene fatto riferimento incrociato, come archiviato nel Registro di sistema. Se si verificano errori causati da definizioni di tipo mancanti, controllare i commenti all'inizio di . TLH per verificare quali librerie di tipi dipendenti devono essere importate per prime. Gli errori possibili sono quelli di sintassi (ad esempio C2143, C2146, C2321), C2501 (specificatori decimali mancanti), oppure C2433 ("inline" non consentito nella dichiarazione di dati) durante la compilazione del file con estensione TLI.
Per risolvere gli errori di dipendenza, determinare quale dei commenti di dipendenza non sono altrimenti forniti per dalle intestazioni di sistema e quindi fornire una direttiva #import in un determinato momento prima della direttiva #import della libreria dei tipi dipendente.
attributi #import
#import facoltativamente può includere uno o più attributi. Questi attributi indicano al compilatore di modificare il contenuto delle intestazioni della libreria dei tipi. Un simbolo barra rovesciata (\) può essere usato per includere righe aggiuntive in una singola istruzione #import . Ad esempio:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Per altre informazioni, vedere #import attributi.
END C++ specifico