Direttiva #import (C++)

C++ specifica

Utilizzato per includere informazioni da una libreria dei tipi.Il contenuto della libreria dei tipi viene convertito nelle classi C++, principalmente descriventi interfacce COM.

#import "filename" [attributes]
#import <filename> [attributes]

Parametri

  • nomefile
    Specifica la libreria dei tipi da includere.filename può essere:

    • Il nome di un file che contiene una libreria dei tipi, ad esempio un 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 i progid.Di seguito è riportato un esempio:

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

      Per ulteriori sui progid, vedere specificare la localizzazione ID e numero di versione.

      Si noti che quando si esegue la compilazione con un compilatore incrociato in un sistema operativo a 64 bit, il compilatore potrà in sola lettura gli 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.

    • La raccolta ID della libreria dei tipi.la parola chiave, LIBID:, può precedere ogni identificazione di libreriaDi seguito è riportato un esempio:

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

      Se non si specifica la versione o LCID, regole si applica a progid: si applica a LIBID:.

    • Un file eseguibile (exe).

    • Un file di libreria (DLL) che contiene una risorsa della libreria dei tipi (come ocx).

    • Un documento composto che utilizza una libreria dei tipi.

    • Qualsiasi altro formato di file che può essere considerato da LoadTypeLib API.

  • attributes
    uno o più attributi #import.Separare gli attributi con uno spazio o una virgola.Di seguito è riportato un esempio:

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

    In alternativa

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

Note

Ordine di ricerca del nome file

nome file facoltativamente è preceduto da una specifica la directory.Il nome file deve avere un file esistente.La differenza tra le due forme di sintassi è l'ordine in cui le ricerche del preprocessore della libreria dei tipi archivia quando il percorso in modo non completo è specificato.

Forme di sintassi

Azione

form tra virgolette

Indica al preprocessore per trovare i file della libreria dei tipi in primo luogo nella directory del file che contiene #import l'istruzione quindi nella directory di qualsiasi file che include (#include) tale file.Il preprocessore quindi cercate lungo i percorsi mostrati in.

Form della parentesi angolare

Indica al preprocessore per trovare i file della libreria dei tipi lungo i seguenti percorsi:

  1. PATH elenco di percorsi di variabili di ambiente

  2. LIB elenco di percorsi di variabili di ambiente

  3. Il percorso specificato dall'opzione del compilatore /I (directory di inclusione aggiuntive), tranne il compilatore sta individuando una libreria dei tipi a cui viene fatto riferimento da un'altra libreria dei tipi con no_registry attributo.

specificare la localizzazione ID e numero di versione

Quando si specifica un progid, è anche possibile specificare la localizzazione ID e il numero di versione del progid.Di seguito è riportato un esempio:

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

Se non si specifica una localizzazione ID, un progid viene scelto secondo le regole seguenti:

  • Se c " è una sola localizzazione ID, quest'ultima viene utilizzato.

  • Se c " è la più di uno localizzazione ID, il primo con i numeri di versione 0, 9, o 409 viene utilizzato.

  • Se c " è più di una localizzazione ID e non ne è 0, 9, o 409, l'ultimo viene utilizzato.

  • Se non si specifica un numero di versione, la versione più recente viene utilizzata.

File di intestazione creati dall'importazione

#import vengono creati 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 Microsoft (MIDL) interface definition language, ma con il codice generato dal compilatore aggiuntivo e i dati.file di intestazione primario ha lo stesso nome di base della libreria dei tipi, seguito da un'estensione di .TLH.Il file di intestazione secondario ha lo stesso nome di base della libreria dei tipi, con estensione .TLI.Contiene le implementazioni per le funzioni membro generati dal compilatore e viene inclusa (#includenel file di intestazione primario.

Se l'importazione della proprietà di interfaccia dispatch che utilizza i parametri di byref, #import non genererà __declspec (proprietà) l'istruzione per la funzione.

Entrambi i file di intestazione sono contenuti nella directory di output specificato dall'opzione di /Fo (file oggetto name).Quindi vengono letti e compilati dal compilatore come se il file di intestazione primario sia stato denominato da un oggetto #include direttiva.

Le ottimizzazioni del compilatore forniti con #import direttiva:

  • Il file di intestazione, una volta creato, viene fornito lo stesso timestamp della libreria dei tipi.

  • quando #import viene elaborato, il compilatore controlla innanzitutto se l'intestazione esiste ed è aggiornata.In caso affermativo, quindi non deve essere ricreato.

#import la direttiva partecipa a ricompilazione minima e può essere posizionato in un file di intestazione precompilato.vedere creare i file di intestazione precompilati per ulteriori informazioni.

8etzzkb6.collapse_all(it-it,VS.110).gifFile di intestazione primario della libreria dei tipi

Il file di intestazione primario della libreria dei tipi è costituito da sette sezioni:

  • Boilerplate intestazione: È costituito da commenti, #include istruzione per COMDEF.H (che definisce alcune macro standard utilizzati nell'intestazione) e altre varie informazioni sull'installazione.

  • riferimenti in avanti e typedef: Include dichiarazioni della struttura come struct IMyInterface e typedef.

  • Dichiarazioni intelligenti del puntatore: la classe modello _com_ptr_t è un'implementazione del Smart-puntatore che incapsula i puntatori a interfaccia ed elimina la necessità di chiamare AddRef, rilasciare, QueryInterface funzioni.inoltre, nasconde CoCreateInstance chiamata nel creare un nuovo oggetto COM.In questa sezione viene utilizzato il macro istruzione _COM_SMARTPTR_TYPEDEF per stabilire i typedef le interfacce COM per essere specializzazioni del modello MVC _com_ptr_t classe modello.Ad esempio, per l'interfaccia IMyInterface, il file di .TLH conterrà:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    quale il compilatore espanderà:

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

    tipo IMyInterfacePtr è quindi possibile utilizzare anziché un puntatore a interfaccia non elaborato IMyInterface*.Di conseguenza, non è necessario chiamare i vari IUnknown funzioni membro

  • dichiarazioni di Typeinfo: Principalmente è costituito dalle definizioni della classe e di altri elementi che espongono i singoli elementi di typeinfo restituiti da ITypeLib: GetTypeInfo.In questa sezione, ogni typeinfo dalla libreria dei tipi si riflette nell'intestazione in un dipendente del form su TYPEKIND informazioni.

  • Definizione di assembly obsoleto facoltativa di GUID: Contiene le inizializzazioni di costanti denominate di GUID.Questi sono nomi del form CLSID_CoClass e IID_Interface, simile a quelli generati dal compilatore MIDL.

  • #include istruzione per l'intestazione secondaria della libreria dei tipi.

  • Boilerplate del piè di pagina: Attualmente includono #pragma pack(pop).

Tutte le sezioni, tranne la sezione di boilerplate intestazione e di boilerplate del piè di pagina, sono racchiuse in uno spazio dei nomi al nome specificato da raccolta istruzione nel file IDL originale.È possibile utilizzare i nomiintestazione della libreria dei tipi da una qualificazione esplicita con il nome dello spazio dei nomi o includendo la seguente istruzione:

using namespace MyLib;

immediatamente dopo il #import istruzione nel codice sorgente.

Lo spazio dei nomi può essere eliminato tramite no_namespace attributo " #import direttiva.Tuttavia, eliminare lo spazio dei nomi può verificarsi conflitti di nomi.Lo spazio dei nomi può anche essere rinominato da rename_namespace attributo.

Il compilatore fornisce il percorso completo di qualsiasi dipendenza della libreria dei tipi richiesta dalla libreria dei tipi in cui è in corso l'elaborazione.Il percorso è scritto, sotto forma di commenti, nell'intestazione della libreria dei tipi (.TLH) che il compilatore genera per ciascuna libreria dei tipi elaborata.

Se una libreria dei tipi include riferimenti a tipi definiti in altre librerie dei tipi, il file di .TLH inserirà i commenti dell'ordinamento:

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

Il nome del file effettivo in #import il commento è il percorso completo della libreria dei tipi riportata, come archiviato nel Registro di sistema.Se si rilevano errori che sono a causa delle definizioni dei tipi, controllare i commenti all'intestazione di .TLH per visualizzare alle librerie dei tipi dipendenti possono essere necessario essere incluso in primo luogo.Gli errori probabili sono errori di sintassi, ad esempio C2143, C2146, C2321), C2501 (decl-identificatori mancanti, oppure C2433 (" consentito inline nella dichiarazione di dati) durante la compilazione del file di .TLI.

È necessario determinare quale dei commenti di dipendenza non sono disponibili in caso contrario per le intestazioni di sistema e quindi fornire #import direttiva a un certo punto prima di #import direttiva della libreria dei tipi dipendente per risolvere gli errori.

Per ulteriori informazioni, vedere l'articolo della Knowledge Base “metodi del wrapper #import possibile che si verifichi una violazione di accesso„ (Q242527) o “errori del compilatore quando si utilizza #import con XML„ (Q269194).È possibile trovare articoli della Knowledge Base sui supporti di MSDN Library o a l https://support.microsoft.com/support/.

Attributi #import

#import può includere facoltativamente uno o più attributi.Questi attributi indicano al compilatore di modificare il contenuto delle intestazioni della libreria dei tipi.Una barra rovesciata (**\**il simbolo può essere utilizzato per includere righe aggiuntive in un singolo #import istruzione.Di seguito è riportato un esempio:

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

Per ulteriori informazioni, vedere Attributi #import (C++).

C++ FINALE specifico

Vedere anche

Riferimenti

Direttive per il preprocessore

Supporto COM del compilatore