Teilen über


#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 oder lcidanwenden, werden die angewendeten progid: Regeln ebenfalls auf libid:.

  • 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 Umgebungsvariablen
2. Die Pfadliste der LIB Umgebungsvariablen
3. 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, ReleaseFunktionen und QueryInterface Funktionen aufzurufenAddRef. Außerdem wird der CoCreateInstance 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 interface IMyInterface, 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 Schnittstellenzeigers IMyInterface* verwendet werden. Folglich ist es nicht erforderlich, die verschiedenen IUnknown 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 den TYPEKIND-Informationen abhängt.

  • Definition der optionalen GUID im alten Format: Enthält Initialisierungen der benannten GUID-Konstanten. Diese Namen weisen das Formular CLSID_CoClass und IID_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

Siehe auch

Präprozessoranweisungen
Com-Compilerunterstützung