#import-Anweisung (C++)
C++-spezifisch
Wird verwendet, um Informationen aus einer Typbibliothek zu integrieren. Der Inhalt der Typbibliothek wird in C++-Klassen konvertiert, die größtenteils die COM-Schnittstellen beschreiben.
Syntax
#import "Dateiname" [Attribute]
<#import Dateiname> [Attribute]
Parameter
filename
Gibt die zu importierende Typbibliothek an. Der Dateiname kann eine der folgenden Arten sein:
Der Name einer Datei, die eine Typbibliothek enthält, z. B. eine OLB-, TLB- oder DLL-Datei. Das Schlüsselwort kann
file:
jedem Dateinamen vorangehenden sein.Die ProgID eines Steuerelements in der Typbibliothek. Das Schlüsselwort kann
progid:
jeder Progid vorangehenden sein. Beispiel:#import "progid:my.prog.id.1.5"
Weitere Informationen zu Progids finden Sie unter Angeben der Lokalisierungs-ID und Versionsnummer.
Wenn Sie einen 32-Bit-Kreuzcompiler auf einem 64-Bit-Betriebssystem verwenden, kann der Compiler nur die 32-Bit-Registrierungsstruktur lesen. Sie sollten den systemeigenen 64-Bit-Compiler verwenden, um eine 64-Bit-Typbibliothek zu erstellen und zu registrieren.
Die Bibliotheks-ID der Typbibliothek. Das Schlüsselwort kann
libid:
jeder Bibliotheks-ID vorangehenden sein. Beispiel:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
Wenn Sie oder nicht angeben
version
lcid
, werden die aufprogid:
angewendeten Regeln auch auf angewendetlibid:
.Ein ausführbare Datei (EXE-Datei).
Eine Bibliotheksdatei (.dll), die eine Typbibliotheksressource (z. B. eine OCX-Datei) enthält.
Ein Verbunddokument, das eine Typbibliothek enthält.
Jedes andere Dateiformat, das von der LoadTypeLib-API verstanden werden kann.
attributes
Mindestens ein #import Attribute. Trennen Sie Attribute entweder mit einem Komma oder einem Leerzeichen. Zum Beispiel:
#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
- oder -
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
Hinweise
Suchauftrag für Dateiname
Filename wird optional eine Verzeichnisspezifikation vorangestellt. Der Dateiname muss eine vorhandene Datei benennen. Der Unterschied zwischen den beiden Syntaxformen liegt in der Reihenfolge, in der der Präprozessor nach den Typbibliotheksdateien sucht, wenn der Pfad unvollständig angegeben wird.
Syntaxformat | Aktion |
---|---|
Format mit Anführungszeichen | Weist den Präprozessor an, zuerst im Verzeichnis der Datei, die die #import-Anweisung enthält, nach Typbibliotheksdateien zu suchen, und dann in den Verzeichnissen der Dateien, die diese Datei enthalten (#include ). Der Präprozessor sucht dann in den unten aufgeführten Verzeichnissen. |
Format mit spitzer Klammer | Weist den Präprozessor an, nach Typbibliotheksdateien in den folgenden Verzeichnissen zu suchen: 1. Die Pfadliste PATH der Umgebungsvariablen2. Die Pfadliste LIB der Umgebungsvariablen3. Der von der /I-Compileroption angegebene Pfad, mit dem Ausnahme, dass der Compiler nach einer Typbibliothek sucht, auf die von einer anderen Typbibliothek mit dem attribut no_registry wurde. |
Angeben der Lokalisierungs-ID und Versionsnummer
Wenn Sie eine ProgID angeben, können Sie auch die Lokalisierungs-ID und die Versionsnummer der ProgID angeben. Beispiel:
#import "progid:my.prog.id" lcid("0") version("4.0)
Wenn Sie keine Lokalisierungs-ID angeben, wird eine Progid gemäß den folgenden Regeln ausgewählt:
Wenn es nur eine Lokalisierungs-ID gibt, wird diese verwendet.
Wenn mehrere Lokalisierungs-IDs verfügbar sind, wird die erste mit versionsnummer 0, 9 oder 409 verwendet.
Wenn es mehr als eine Lokalisierungs-ID gibt und keine von ihnen 0, 9 oder 409 ist, wird die letzte verwendet.
Wenn Sie keine Versionsnummer angeben, wird die neueste Version verwendet.
Vom Import erstellte Headerdateien
#import erstellt zwei Headerdateien, die den Inhalt der Typbibliothek im C++-Quellcode rekonstruieren. Die primäre Headerdatei ähnelt der, die vom MIDL-Compiler (Microsoft Interface Definition Language) erstellt wurde, enthält jedoch zusätzlichen vom Compiler generierten Code und zusätzliche Daten. Die primäre Headerdatei hat den gleichen Basisnamen wie die Typbibliothek sowie eine . TLH-Erweiterung. Die sekundäre Headerdatei weist den gleichen Basisnamen wie die Typbibliothek auf, mit einer TLI-Erweiterung. Sie enthält die Implementierungen für vom Compiler generierte Memberfunktionen und wird in die primäre Headerdatei eingefügt (#include
).
Beim Importieren einer Dispinterface-Eigenschaft byref
, die Parameter verwendet, generiert #import keine __declspec(property) -Anweisung für die Funktion.
Beide Headerdateien werden in dem Ausgabeverzeichnis platziert, das durch die Option /Fo (Name der Objektdatei) angegeben wird. Sie werden dann vom Compiler gelesen und kompiliert, als ob die primäre Headerdatei durch eine -Anweisung benannt #include
wurde.
Die folgenden Compileroptimierungen sind mit der #import-Direktive :
Wenn sie erstellt wird, wird der Headerdatei der gleiche Zeitstempel gegeben wie der Typbibliothek.
Wenn #import verarbeitet wird, überprüft der Compiler zunächst, ob der Header vorhanden und auf dem neuesten Stand ist. Wenn ja, muss es nicht neu erstellt werden.
Die #import-Direktive nimmt auch an der minimalen Neuerstellung teil und kann in einer vorkompilierten Headerdatei platziert werden. Weitere Informationen finden Sie unter Erstellen von vorkompilierten Headerdateien.
Headerdatei der primären Typbibliothek
Die primäre Headerdatei der Typbibliothek umfasst sieben Abschnitte:
Textbaustein für Überschrift: Besteht aus Kommentaren, der
#include
-Anweisung für COMDEF.H (das mehrere Standardmakros definiert, die im Header verwendet werden) und weiteren verschiedenen Setupinformationen.Vorwärtsverweise und Typdefinitionen: Bestehen aus Strukturdeklarationen wie
struct IMyInterface
und Typdefinitionen.Intelligente Zeigerdeklarationen: Die Vorlagenklasse
_com_ptr_t
ist ein intelligenter Zeiger. Sie kapselt Schnittstellenzeige und macht es nicht mehrAddRef
Release
notwendig, die Funktionen , und aufQueryInterface
aufruft. Außerdem wird der Aufruf beimCoCreateInstance
Erstellen eines neuen COM-Objekts ausblendet. In diesem Abschnitt wird die Makro-Anweisung_COM_SMARTPTR_TYPEDEF
verwendet, um Typedefs von COM-Schnittstellen als Vorlagenspezialisierungen der _com_ptr_t zu erstellen . Für die -Schnittstelle istIMyInterface
z. B. der . Die TLH-Datei enthält Folgendes:_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
Dies wird vom Compiler zu Folgendem erweitert:
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
Typ
IMyInterfacePtr
kann dann anstelle des nicht formatierten SchnittstellenzeigersIMyInterface*
verwendet werden. Daher ist es nicht notwendig, die verschiedenen MemberfunktionenIUnknown
auf aufrufen zu müssen.Typeinfo-Deklarationen: Besteht hauptsächlich aus Klassendefinitionen und anderen Elementen, die die einzelnen typeinfo-Elemente verfügbar machen, die von zurückgegeben werden
ITypeLib:GetTypeInfo
. In diesem Abschnitt wird jede Typinformation aus der Typbibliothek im Header in einem Format wiedergegeben, das von denTYPEKIND
-Informationen abhängt.Definition der optionalen GUID im alten Format: Enthält Initialisierungen der benannten GUID-Konstanten. Diese Namen haben das Formular und
CLSID_CoClass
IID_Interface
, ähnlich wie die vom MIDL-Compiler generierten Namen.#include
-Anweisung für den sekundären Header der Typbibliothek.Textbaustein für Footer: Schließt aktuell
#pragma pack(pop)
ein.
Alle Abschnitte, mit Ausnahme der Textbausteinbaustein- und Fußzeilenbausteinabschnitte, werden in library
einen Namespace mit dem Namen eingeschlossen, der von der -Anweisung in der ursprünglichen IDL-Datei angegeben wird. Sie können die Namen aus dem Typbibliotheksheader mithilfe des Namespacenamens durch eine explizite Qualifikation verwenden. Sie können auch die folgende -Anweisung verwenden:
using namespace MyLib;
unmittelbar nach der #import anweisung im Quellcode.
Der Namespace kann unterdrückt werden, indem das attribut no_namespace) der #import wird . Allerdings kann das Unterdrücken des Namespace zu Namenskonflikten führen. Der Namespace kann auch durch das attribut rename_namespace umbenannt werden .
Der Compiler stellt den vollständigen Pfad zu jeder Typbibliotheksabhängigkeit zur Verfügung, die für die aktuell verarbeitete Typbibliothek erforderlich ist. Der Pfad wird in Form von Kommentaren in den Header der Typbibliothek (.TLH) geschrieben, den der Compiler für jede verarbeitete Typbibliothek erstellt.
Wenn eine Typbibliothek Verweise auf Typen enthält, die in anderen Typbibliotheken definiert sind, dann enthält die TLH-Datei Kommentare folgender Art:
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
Der tatsächliche Dateiname im #import ist der vollständige Pfad der Typbibliothek, auf die verwiesen wird, wie in der Registrierung gespeichert. Wenn Fehler auftreten, die durch fehlende Typdefinitionen verursacht werden, überprüfen Sie die Kommentare am Anfang von . TLH, um zu sehen, welche abhängigen Typbibliotheken möglicherweise zuerst importiert werden müssen. Wahrscheinliche Fehler sind Syntaxfehler (z. B. C2143, C2146, C2321), C2501 (fehlende decl-Spezifizierer) oder C2433 ("inline" bei Datendeklaration nicht zulässig) beim Kompilieren der TLI-Datei.
Um Abhängigkeitsfehler zu beheben, bestimmen Sie, welche der Abhängigkeitskommentare nicht anderweitig von Systemheadern bereitgestellt werden, und geben Sie dann zu einem bestimmten Zeitpunkt vor der #import-Direktive der abhängigen Typbibliothek eine #import-Direktive an.
#import Attribute
#import kann optional ein oder mehrere Attribute enthalten. Diese Attribute weisen den Compiler an, den Inhalt der Typbibliotheksheader zu ändern. Ein symbol für einen schrägen Schrägstrich (\) kann verwendet werden, um zusätzliche Zeilen in eine einzelne #import einbetten . Beispiel:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Weitere Informationen finden Sie unter #import Attribute.
Ende C++-spezifisch