IMPDEF.EXE, le gestionnaire de définition de module

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilitaires de ligne de commande - Index

Remarque : IMPDEF n'est utilisé actuellement que pour les applications Win32.
Pour les applications Win64, utilisez MKEXP.EXE, l'outil bibliothèque d'importation Windows 64 bits pour C++.

Les bibliothèques d'importation permettent d'accéder aux fonctions d'une DLL Windows. Les bibliothèques d'importation contiennent des enregistrements. Chaque enregistrement contient le nom d'une DLL et spécifie l'emplacement dans la DLL des fonctions importées. Ces enregistrements sont liés à l'application par le lieur, et ils fournissent à Windows les informations nécessaires pour résoudre les appels de fonctions de DLL. Vous pouvez substituer une bibliothèque d'importation à une partie ou à la totalité de la section IMPORTS d'un fichier de définition de module.

IMPDEF accepte en entrée un nom de DLL et génère en sortie un fichier de définition de module avec une section EXPORTS contenant les noms des fonctions exportées par la DLL.

Syntaxe de la ligne de commande

IMPDEF <options> <destination.def> <source.dll>

Pour afficher l'aide de la ligne de commande, entrez :

impdef 


Options de ligne de commande

Option Description

-a

Ajoute un alias _ pour les fonctions cdecl de compatibilité avec les bibliothèques Microsoft.

-h

Emet des conseils.


Par exemple :

IMPDEF NomDest.DEF NomSource.DLL

Cette commande crée un fichier de définition de module nommé NomDest.DEF à partir du fichier NomSource.DLL. Le fichier de définition de module résultant serait de la forme :

LIBRARY     <NomFichier>
DESCRIPTION '<Description>'
EXPORTS
            <NomFoncExport>              @<Ordinal>
        .
        .
        .
            <NomFoncExport>              @<Ordinal>
  • <NomFichier> désigne le nom du fichier racine de la DLL.
  • '<Description>' est la valeur de l'instruction DESCRIPTION si la DLL a déjà été liée à un fichier de définition de module incluant une instruction DESCRIPTION.
  • <NomFoncExport> désigne une fonction exportée.
  • <Ordinal> désigne la valeur ordinale de cette fonction (un entier).


Classes dans une DLL

IMPDEF est utile pour une DLL utilisant des classes C++. Si vous utilisez le mot clé __declspec (ou _export) lors de la définition d'une classe, toutes les fonctions membres non inline et toutes les données membres statiques de cette classe sont exportées. Il est plus facile de laisser IMPDEF produire lui-même un fichier de définition de module, car il liste toutes les fonctions exportées et inclut automatiquement les fonctions membres et les données membres statiques.

Comme les noms de ces fonctions sont substantypés, il serait fastidieux de tous les énumérer dans la section EXPORTS d'un fichier de définition de module simplement pour créer une bibliothèque d'importation à partir du fichier de définition de module. Si vous utilisez IMPDEF pour créer le fichier de définition de module, il inclura la valeur ordinale de chaque fonction exportée. Si le nom exporté est substantypé, IMPDEF inclura aussi le nom d'origine non substantypé de cette fonction en commentaire à la suite de l'entrée correspondant à la fonction. Ainsi, par exemple :

LIBRARY     <NomFichier>
DESCRIPTION '<Description>'
EXPORTS
            <NomFoncExportSubst>  @<Ordinal> ; <NomFoncExport>
        .
        .
        .
            <NomFoncExportSubst>  @<Ordinal> ; <NomFoncExport>
  • <NomFichier> désigne le nom du fichier racine de la DLL.
  • '<Description>' est la valeur de l'instruction DESCRIPTION si la DLL a déjà été liée à un fichier de définition de module incluant une instruction DESCRIPTION.
  • <NomFoncExportSubst> désigne le nom substantypé.
  • <Ordinal> désigne la valeur ordinale de cette fonction (un entier).
  • <NomFoncExport> désigne le nom d'origine de la fonction.

Fonctions dans une DLL

IMPDEF crée un fichier source éditable listant toutes les fonctions exportées de la DLL. Vous pouvez modifier ce fichier .DEF afin qu'il ne contienne que les fonctions à mettre à la disposition d'une application particulière, puis exécuter IMPLIB sur le fichier .DEF modifié. Il en résulte une bibliothèque d'importation contenant des informations d'importation pour un sous-ensemble particulier des fonctions d'exportation d'une DLL.

Supposons que vous soyez en train de distribuer une DLL contenant des fonctions destinées à être utilisées par plusieurs applications. Chaque fonction d'exportation de la DLL est définie par __declspec (ou _export). Si toutes les applications utilisaient toutes les exportations de la DLL, vous pourriez utiliser IMPLIB pour créer une bibliothèque d'importation pour la DLL. Vous pourriez livrer cette bibliothèque d'importation avec la DLL et elle fournirait des informations d'importation pour toutes les exportations de la DLL. La bibliothèque d'importation pourrait être liée à n'importe quelle application, ce qui éliminerait la nécessité pour cette application particulière de lister chacune des fonctions de DLL qu'elle utilise dans la section IMPORTS de son fichier de définition de module.

Mais supposons que vous ne souhaitiez mettre à la disposition d'une application particulière que quelques-unes des exportations de la DLL. Idéalement, vous souhaiterez lier à cette application une bibliothèque d'importation personnalisée -- une bibliothèque d'importation ne fournissant des informations d'importation que pour le sous-ensemble de fonctions utilisé par l'application. Toutes les autres fonctions d'exportation de la DLL seront dissimulées à cette application cliente.

Pour créer une bibliothèque d'importation répondant à ces conditions, exécutez IMPDEF sur la DLL compilée et liée. IMPDEF produit un fichier de définition de module contenant une section EXPORT qui énumère toutes les fonctions d'exportation de la DLL. Vous pouvez éditer ce fichier de définition de module, retirer les entrées de section EXPORTS des fonctions que vous ne voulez pas voir apparaître dans la bibliothèque d'importation personnalisée, puis exécuter IMPLIB sur le fichier de définition de module. Il en résultera une bibliothèque d'importation ne contenant des informations d'importation que pour les fonctions d'exportation listées dans la section EXPORTS du fichier de définition de module.

Voir aussi