Comment faire pour créer la source ou de bibliothèques d'importation de 32 bits sans .OBJs

Traductions disponibles Traductions disponibles
Numéro d'article: 131313 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article explique comment créer une bibliothèque d'importation étant donné une .dll pour lequel vous ne disposez d'aucun module de code ou l'objet source. Il n'existe aucun utilitaire 32 bits qui peut créer une bibliothèque d'importation à partir d'une DLL, comme cela était le cas avec les versions 16 bits de Visual C++.

Remarque : cette méthode peut ne pas fonctionne avec les DLL générées avec les outils de développement non Microsoft.

Plus d'informations

Normalement, lorsque générer une .dll ou n'importe quelle cible qui exporte des fonctions ou des éléments de données, une bibliothèque d'importation (et exporte le fichier) est générée dans le cadre du processus de liaison. Mais, dans le cas de .dll tiers qui n'est pas livré avec une bibliothèque d'importation, il se peut que vous deviez générer une bibliothèque d'importation afin d'utiliser la DLL avec succès à l'aide de liaison dynamique au moment du chargement. Une bibliothèque d'importation n'est pas nécessaire pour la liaison dynamique au moment de l'exécution.

Il existe deux façons de créer une bibliothèque d'importation étant donné un .dll :
  • Créer un fichier .def pour une utilisation avec le LIB /DEF : commande.
  • Les fonctions de stub et utiliser les fichiers .obj créés pour simuler les relations d'importation/exportation. Utilisez ensuite la LIB /DEF : commande pour créer la bibliothèque d'importation.

Création d'un fichier .def

Le seul moment où vous pouvez utiliser un fichier .def pour créer une bibliothèque d'importation à partir d'une DLL pour laquelle vous n'avez pas le code source ou objet modules est que si la DLL exporte des fonctions par le biais d'une interface de C. Plus précisément, les fonctions doivent avoir été déclaré pour utiliser la convention d'appel C. Cela est spécifié par l'attribut _cdecl normalement utilisé dans le prototype pour la fonction. Notez que si aucun attribut n'est spécifié, _cdecl est la valeur par défaut lorsque /GZ (_stdcall est la valeur par défaut) ou /GR (_fastcall est la valeur par défaut) n'est pas spécifié sur la ligne de commande CL. La raison de cette limitation est basée sur une hypothèse effectuée par l'utilitaire LIB que tous les noms sont automatiquement exportées sans un trait de soulignement de début. Ceci est vrai pour les noms de fonction _cdecl uniquement.

Étant donné un .dll avec les fonctions exportées par le biais d'une interface C, vous pouvez créer une bibliothèque d'importation en procédant comme suit :
  1. Utilisez DUMPBIN /EXPORTS < nom du fichier .dll > pour obtenir la liste des symboles exportés pour la DLL en question. Les symboles s'affichent dans la colonne «nom» de la table dont les en-têtes sont «nom d'indicateur ordinal».
  2. Créer un fichier .def qui contient une section EXPORTS avec les noms des fonctions figurant dans la colonne «nom» de la sortie DUMPBIN.
  3. Pour les fonctions _cdecl, le symbole apparaît exactement comme lorsqu'elle est utilisée dans le programme appelant. Placez simplement ce symbole dans la section EXPORTS du fichier .def.
  4. Utilisez LIB /DEF: < nom du fichier .def > pour générer l'importation de bibliothèque et de fichier des exportations. Le nom de base de la bibliothèque d'importation sera le nom de base du fichier .def. Utilisez/OUT : pour contrôler le nom de bibliothèque de sortie.

Stubbing out fonctions

Pour des fonctions exportées qui utilisent des conventions d'appel autre que C, la situation est un peu plus complexe. Ceci est particulièrement vrai lorsque vous envisagez fonctions C++ et les jeux de décoration de nom plus complexes impliqués. Pour utiliser cette méthode, vous devez disposer au moins le fichier d'en-tête qui décrit l'interface de la DLL.

Pour créer des fonctions stub à partir de prototypes dans un fichier d'en-tête :
  1. Lorsque «__declspec (dllimport)» est utilisé dans une déclaration ou de prototype, remplacez-la par "__declspec (dllexport)."
  2. Pour les fonctions qui ne sont pas retourner une valeur pour les fonctions C dans source C et pour les fonctions C dans le code de source C++ (utilisé avec la construction 'extern "C" '), remplacez le point-virgule qui termine le prototype de fonction avec un couple correspondant d'entre accolades («{}»).
  3. Pour les fonctions C++ (globale ou membre) qui retournent une valeur, vous devez créer un corps factice pour la fonction et retourner une valeur factice du type approprié. (Le fait de ne pas avoir une instruction return dans la fonction est non conforme.) Cela va de fonctions membres de classe, ainsi. Gardez à l'esprit que l'objectif de cette procédure consiste à amener l'utilitaire LIB dans génération de la bibliothèque d'importation correct, afin que ces organismes factices n'ont aucun effet.
  4. Pour les classes C++, vous pouvez stub les fonctions de membre à l'aide des prototypes dans la déclaration de classe, tant que vous désactivez la fonctionnalité inline lorsque vous compilez.
  5. Arguments de fonction sont habituellement juste spécifiés par type dans un fichier d'en-tête. Par exemple, geta(int). Un identificateur d'argument factice doit être spécifié lorsque vous ajoutez le corps de la fonction factice Geta(int x). Sinon l'erreur C2055 est générée.

Exemple

Si le fichier d'en-tête qui décrit MYDLL.DLL ressemble à:
// mydll.H

extern "C" __declspec(dllimport) void _stdcall Function(void);

class __declspec(dllimport) CMyClass {
     int a;
     long b;
public:
     int Geta(int);
     long Getb();
     CMyClass();
};
				
le fichier source factice vous permet de construire la bibliothèque d'importation doit ressembler à:
 // mydll.CPP

 extern "C" __declspec(dllexport) void _stdcall Function(void) {}

 class __declspec(dllexport) CMyClass {
      int a;
      long b;
 public:
      int Geta(int x) {return 111;}
      long Getb() {return 111;}
      CMyClass() {}
 };
				
une fois les fonctions sont des, il vous souhaitez est compiler le fichier source dans un fichier .obj :
CL /c /Ob0 mydll.CPP
Remarque : Désactiver la fonctionnalité inline est requise pour forcer la génération de symboles pour les fonctions définies dans CMyClass. Si la fonction inline était activée, le compilateur aurait Notez qu'il n'y a aucune référence aux fonctions membres dans l'unité de traduction, donc il, vous ignorez les corps de fonction. Consultez la discussion sur l'expansion de la fonction inline sous optimisations dans la référence de ligne de commandes de CL Visual C++.

Une fois que vous avez des fichiers .obj, vous pouvez utiliser LIB /DEF : pour créer la bibliothèque d'importation (.lib) et le fichier des exportations (.exp) :
LIB /DEF : mydll.OBJ
Pour plus d'informations sur la commande LIB, consultez «Référence LIB» dans Visual C++ Books Online.

En outre, consultez l'article suivant dans la base de connaissances Microsoft :
140485L'exportation de symboles PASCAL comme dans les DLL 32 bits

Propriétés

Numéro d'article: 131313 - Dernière mise à jour: mardi 29 juin 2004 - Version: 2.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • The Microsoft Library Manager (LIB.EXE) sur le système suivant
    • Microsoft Visual C++ 2.0 Édition Professionnelle
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 5.0 Édition Standard
Mots-clés : 
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 131313
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com