#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 "filename" [attributes]
<#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 ,
file:
kann jedem Dateinamen vorangestellt werden.Die ProgID eines Steuerelements in der Typbibliothek. Das Schlüsselwort ,
progid:
kann jedem Progid vorangehen. Zum 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 ,
libid:
kann jeder Bibliotheks-ID vorangestellt werden. Zum Beispiel:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
Wenn Sie die angewendeten Regeln nicht angeben
version
oderlcid
anwenden, werden die angewendetenprogid:
Regeln ebenfalls auflibid:
.Ein ausführbare Datei (EXE-Datei).
Eine Bibliotheksdatei (.dll), die eine Typbibliotheksressource (z. B. ocx) 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
Suchreihenfolge für Dateinamen
dateiname ist optional einer 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 aller 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 der PATH Umgebungsvariablen2. Die Pfadliste der LIB Umgebungsvariablen3. Der durch die /I-Compileroption angegebene Pfad, mit der Ausnahme, dass der Compiler nach einer Typbibliothek sucht, auf die von einer anderen Typbibliothek mit dem attribut no_registry verwiesen 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. Zum 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 nur eine Lokalisierungs-ID vorhanden ist, wird diese verwendet.
Wenn mehr als eine Lokalisierungs-ID vorhanden ist, wird die erste mit Versionsnummer 0, 9 oder 409 verwendet.
Wenn mehr als eine Lokalisierungs-ID vorhanden ist und keine davon 0, 9 oder 409 ist, wird die letzte verwendet.
Wenn Sie keine Versionsnummer angeben, wird die neueste Version verwendet.
Kopfzeilendateien, die durch Import erstellt wurden
#import erstellt zwei Headerdateien, die den Typbibliotheksinhalt im C++-Quellcode rekonstruieren. Die primäre Headerdatei ähnelt dem, der vom Microsoft Interface Definition Language (MIDL)-Compiler erstellt wird, aber mit zusätzlichem compilergeneriertem Code und Daten. Die primäre Headerdatei hat den gleichen Basisnamen wie die Typbibliothek sowie ein . 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, die Parameter verwendetbyref
, generiert #import keine __declspec(property)-Anweisung für die Funktion.
Beide Headerdateien werden im Ausgabeverzeichnis platziert, das durch die Option /Fo (Name-Objektdatei) angegeben wird. Sie werden dann vom Compiler gelesen und kompiliert, als ob die primäre Headerdatei von einer #include
Direktive benannt wurde.
Die folgenden Compileroptimierungen stammen aus 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 zuerst, ob der Header vorhanden ist und auf dem neuesten Stand ist. Wenn ja, muss sie nicht erneut erstellt werden.
Die #import Direktive nimmt auch an einer minimalen Neuerstellung teil und kann in einer vorkompilierten Headerdatei platziert werden. Weitere Informationen finden Sie unter Erstellen von vorkompilierten Headerdateien.
Primäre Typbibliotheksheaderdatei
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. Es kapselt Schnittstellenzeiger und beseitigt die Notwendigkeit, Aufrufe,Release
Funktionen undQueryInterface
Funktionen aufzurufenAddRef
. Außerdem wird derCoCreateInstance
Aufruf beim Erstellen eines neuen COM-Objekts ausgeblendet. In diesem Abschnitt wird die Makroanweisung_COM_SMARTPTR_TYPEDEF
verwendet, um Typbeschreibungen von COM-Schnittstellen als Vorlagenspezialisierungen der _com_ptr_t Vorlagenklasse einzurichten. For example, for interfaceIMyInterface
, the . 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. Folglich ist es nicht erforderlich, die verschiedenenIUnknown
Memberfunktionen aufzurufen.Typeinfo-Deklarationen: Besteht in erster Linie aus Klassendefinitionen und anderen Elementen, die die einzelnen typeinfo-Elemente verfügbar machen, die von
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 weisen das Formular
CLSID_CoClass
undIID_Interface
ähnlich wie die vom MIDL-Compiler generierten Namen auf.#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 des Abschnitts "Überschriftenbaustein" und "Fußzeilenbaustein" werden in einen Namespace eingeschlossen, dessen Name durch die Anweisung in der library
ursprünglichen IDL-Datei angegeben ist. Sie können die Namen aus dem Typbibliotheksheader mithilfe des Namespacenamens explizit verwenden. Sie können auch die folgende Anweisung einschließen:
using namespace MyLib;
unmittelbar nach der #import-Anweisung im Quellcode.
Der Namespace kann mithilfe des no_namespace)-Attributs der #import-Direktive unterdrückt werden. 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 bereit, die von der Typbibliothek benötigt wird, die gerade verarbeitet wird. 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 Kommentar ist der vollständige Pfad der querverweisten Typbibliothek, wie in der Registrierung gespeichert. Wenn Fehler auftreten, die durch fehlende Typdefinitionen verursacht werden, überprüfen Sie die Kommentare am Anfang der . TLH, um festzustellen, welche abhängigen Typbibliotheken 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 andernfalls von Systemheadern bereitgestellt werden, und stellen Sie dann irgendwann eine #import Direktive vor der #import-Direktive der abhängigen Typbibliothek bereit.
#import Attribute
#import können optional ein oder mehrere Attribute enthalten. Diese Attribute weisen den Compiler an, den Inhalt der Typbibliotheksheader zu ändern. Ein umgekehrter Schrägstrich (\) kann verwendet werden, um zusätzliche Zeilen in eine einzelne #import Anweisung einzuschließen. Zum Beispiel:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Weitere Informationen finden Sie unter #import Attribute.
END C++-spezifisch