Directive #import (C++)
Détail C++
Utilisé pour incorporer les informations d'une bibliothèque de types.Le contenu de la bibliothèque de types est converti dans des classes C++, qui décrivent principalement des interfaces COM.
#import "filename" [attributes]
#import <filename> [attributes]
Paramètres
filename
spécifie la bibliothèque de types pour importer.filename peut avoir l'une des valeurs suivantes :le nom d'un fichier qui contient une bibliothèque de types, telle qu'un .olb, .tlb, ou fichier.DLL.le mot clé, fichier :, peut précéder chaque nom de fichier.
le progid d'un contrôle à la bibliothèque de types.le mot clé, progid :, peut précéder chaque progid.Par exemple :
#import "progid:my.prog.id.1.5"
Pour plus d'informations sur les progid, consultez Spécifier l'ID et le numéro de version de localisation.
Notez que lorsque vous compilez avec un compilateur croisé sur un système d'exploitation 64 bits, le compilateur peut indiquer que la ruche du Registre 32 bits.Vous pouvez utiliser le compilateur 64 bits natif pour générer et inscrire une bibliothèque de types 64 bits.
L'ID de bibliothèque de la bibliothèque de types.Le mot clé, libid :, peut précéder chaque ID de bibliothèquePar exemple :
#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
Si vous ne spécifiez pas la version ou le LCID, règles appliqués à progid : sont également appliqués à libid :.
Un fichier exécutable (.exe).
Un fichier .dll contenant une ressource de bibliothèque de types (telle que .ocx).
Un document composite maintenant une bibliothèque de types.
Autre format de fichier qui peut être inclus par l'API de LoadTypeLib .
attributes
un ou plusieurs attributs #import.Sépare les attributs par un espace ou une virgule.Par exemple :#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
ou
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
Notes
Ordre de recherche pour le nom de fichier
le nom de fichier est éventuellement précédé d'une spécification de répertoire.le nom de fichier doit nommer un fichier existant.La différence entre les deux formes de syntaxe est l'ordre dans lequel le préprocesseur recherche les fichiers bibliothèque de types lorsque le chemin d'accès est incomplètement spécifié.
Format de syntaxe |
Action |
---|---|
forme avec guillemets |
Demande au préprocesseur pour rechercher des fichiers bibliothèque de types d'abord dans le répertoire du fichier qui contient l'instruction d' #import , puis dans les répertoires de la logique de fichiers qui incluent (#include) ce fichier.Les recherches de préprocesseur puis selon les chemins d'accès affichés ci-dessous. |
Formulaire de crochet angulaire |
Demande au préprocesseur de rechercher des fichiers bibliothèque de types en utilisant les chemins suivants :
|
Spécifier l'ID et le numéro de version de localisation
Lorsque vous spécifiez un progid, vous pouvez également spécifier l'ID de localisation et le numéro de version du progid.Par exemple :
#import "progid:my.prog.id" lcid("0") version("4.0)
Si vous ne spécifiez pas d'ID de localisation, un progid est choisi d'après les règles suivantes :
S'il n'existe qu'un ID de localisation, que l'un est utilisé.
S'il existe plusieurs ID de localisation, le premier avec le numéro de version 0, 9, ou 409 est utilisé.
S'il existe plusieurs ID de localisation et aucun des deux n'est 0, 9, ou 409, dernier est utilisé.
si vous ne spécifiez pas un numéro de version, la dernière version est utilisée.
fichiers d'en-tête créés par l'importation
#import crée deux fichiers d'en-tête qui reconstruisent le contenu de la bibliothèque de types dans le code source C++.Le fichier d'en-tête primaire est similaire à celle produit par le compilateur (MIDL) MIDL (Microsoft Interface Definition langage), mais avec le code généré par le compilateur supplémentaire et des données.fichier d'en-tête primaire possède le même nom que la bibliothèque de types, suivi d'une extension de .TLH.Le fichier d'en-tête secondaire possède le même nom que la bibliothèque de types, avec une extension de .TLI.Il contient des implémentations pour les fonctions membres générées par le compilateur, et est inclus (#include) dans le fichier d'en-tête primaire.
Si l'importation d'une propriété dispinterface qui utilise des paramètres byref, #import ne générera pas l'instruction de __declspec (propriété) pour la fonction.
Les deux fichiers d'en-tête sont placés dans le répertoire de sortie spécifié par l'option /Fo (fichier objet de nom).Ces informations sont ensuite lus et compilés par le compilateur que si le fichier d'en-tête principal a été nommé par une directive d' #include .
Les optimisations du compilateur suivantes s'accompagnent la directive d' #import :
Le fichier d'en-tête, une fois créé, porte le même horodatage que la bibliothèque de types.
Lorsque #import est traité, de compilateur les contrôles d'abord si l'en-tête existe et est à jour.Si tel est le cas, elle n'a pas besoin d'être recréée.
La directive d' #import également participe à la régénération minimale et peut être placée dans un fichier d'en-tête précompilé.Consultez Création de fichiers d'en-tête précompilés pour plus d'informations.
Fichier d'en-tête primaire de la bibliothèque de types
Le fichier d'en-tête primaire de la bibliothèque de types se compose de sept sections :
zones fixes de titre : Se compose des commentaires, de l'instruction d' #include pour COMDEF.H (qui définit des macros standard utilisées dans l'en-tête), et d'autres nombreuses informations de configuration.
Références vers l'avant et typedefs : Se compose des déclarations de structure comme struct IMyInterface et typedef.
déclarations intelligentes de pointeur : La classe de modèle _com_ptr_t est une implémentation de SMART-pointeur qui encapsule des pointeurs d'interface et élimine le besoin d'appeler AddRef, Release, fonctions d' QueryInterface .en outre, elle masque l'appel d' CoCreateInstance en créant un nouvel objet COM.Cette section utilise la macro instruction _COM_SMARTPTR_TYPEDEF pour générer des typedefs des interfaces COM pour être des spécialisations de modèle de la classe de modèle de _com_ptr_t .par exemple, pour l'interface IMyInterface, le fichier de .TLH contiendra :
_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
ce que le compilateur se développe :
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
Le type IMyInterfacePtr peut ensuite être utilisé à la place du pointeur d'interface brut IMyInterface*.Par conséquent, il n'y a aucun besoin d'appeler les différentes fonctions membres d' IUnknown
déclarations de Typeinfo : se compose principalement des définitions de classe et d'autres éléments exposant les différents éléments de typeinfo retournés par ITypeLib : GetTypeInfo.Dans cette section, chaque typeinfo de la bibliothèque de types est répercutée dans l'en-tête dans un formulaire dépendant des informations d' TYPEKIND .
Définition à l'ancien facultative de GUID : Contient les initialisations de constantes nommées GUID.Ce sont des noms du formulaire CLSID_CoClass et IID_Interface, semblables à celles créées par le compilateur MIDL.
instruction d'#include pour l'en-tête secondaire de la bibliothèque de types.
zones fixes de pied de page : Inclut actuellement #pragma pack(pop).
Toutes les sections, à l'exception de la section de zones fixes de titre et de zones fixes de pied de page, sont placées dans un espace de noms portant le nom spécifié par l'instruction de bibliothèque dans le fichier de l'original IDL.Vous pouvez utiliser les noms de l'en-tête de la bibliothèque de types par une qualification explicite avec le nom de l'espace de noms ou en incluant l'instruction suivante :
using namespace MyLib;
immédiatement après l'instruction d' #import dans le code source.
l'espace de noms peut être supprimé à l'aide de l'attribut de no_namespace de la directive d' #import .Toutefois, supprimer l'espace de noms peut entraîner des collisions de noms.l'espace de noms peut également être renommé par l'attribut de rename_namespace .
Le compilateur fournit le chemin d'accès complet à toute dépendance de bibliothèque de types requis par la bibliothèque de types qu'elle traite actuellement.Le chemin d'accès est écrit, sous la forme de commentaires, dans l'en-tête de la bibliothèque de types (.TLH) que le compilateur génère pour chaque bibliothèque de types traitée.
Si une bibliothèque de types inclut des références aux types définis dans d'autres bibliothèques de types, le fichier de .TLH inclura les commentaires du tri suivant :
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
Le nom de fichier réel du commentaire d' #import est le chemin d'accès complet de la bibliothèque de types à références croisées, stocké dans le Registre.Si vous rencontrez des erreurs dues à des définitions de type manquantes, vérifiez les commentaires au début du .TLH pour afficher à partir duquel les bibliothèques de types dépendantes peuvent avoir besoin pour être importées en premier.Les erreurs possibles sont des erreurs de syntaxe (par exemple, C2143, C2146, C2321), C2501 (déclassement-spécificateurs absents), ou C2433 (" inline » non - autorisé sur une déclaration de données) en compilant le fichier de .TLI.
Vous devez déterminer les commentaires de dépendance ne sont pas autrement fournis pour par les en-têtes systèmes puis fournir une directive d' #import à un certain point avant la directive d' #import de la bibliothèque de types dépendante pour les résoudre.
Pour plus d'informations, consultez l'article de la Base de connaissances « méthodes de wrapper #import peut provoquer une violation d'accès » (Q242527) ou « erreurs du compilateur lorsque vous utilisez #import avec XML » (Q269194).vous pouvez rechercher des articles de la Base de connaissances sur MSDN Library multimédia ou à https://support.microsoft.com/support/.
Attributs #import
#import peut éventuellement inclure un ou plusieurs attributs.ces attributs indiquent le compilateur modifier le contenu des en-têtes de bibliothèque de types.Un symbole de barre oblique inverse (\) peut être utilisé pour inclure des lignes supplémentaires dans une seule instruction d' #import .Par exemple :
#import "test.lib" no_namespace \
rename("OldName", "NewName")
Pour plus d'informations, consultez Attributs #import (C++).
détail de FIN C++