Condividi tramite


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 o lcid, le regole applicate a progid: vengono applicate anche a libid:.

  • 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 ambiente
2. Elenco dei percorsi delle LIB variabili di ambiente
3. 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 chiamare AddRefle funzioni , Releasee QueryInterface . Nasconde inoltre la chiamata durante la CoCreateInstance 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'interfaccia IMyInterface, . 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 raw IMyInterface*. Di conseguenza, non è necessario chiamare le varie IUnknown funzioni membro

  • Dichiarazioni 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 informazioni TYPEKIND.

  • Definizione di GUID obsoleta facoltativa: contiene le inizializzazioni delle costanti GUID denominate. Questi nomi hanno il formato CLSID_CoClass e IID_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

Vedi anche

Direttive del preprocessore
Supporto COM del compilatore