IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Développement DLL C++ et test


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Développement DLL C++ et test
    Bonjour,

    Je développe d'habitude en Delphi, mais je souhaite développer une DLL en C++ et donc je débute en ce langage. Pour tester le développement de DLL voici le code que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    //   Remarque importante sur la gestion mémoire de la DLL quand votre DLL utilise la
    //   version statique de la bibliothèque d'exécution (RTL) :
    //
    //   Si votre DLL exporte des fonctions qui passent des objets chaîne (ou des classes structs/
    //   contenant des chaînes imbriquées) par le biais de paramètres ou de résultats de fonctions,
    //   vous devrez ajouter la bibliothèque MEMMGR.LIB au projet DLL et aux autres
    //   projets qui utilisent la DLL.  Il sera aussi nécessaire d'utiliser MEMMGR.LIB
    //   si d'autres projets utilisant la DLL effectuent des opérations new ou delete
    //   sur des classes ne dérivant pas de TObject qui sont exportées depuis la
    //   DLL. Ajouter MEMMGR.LIB à votre projet changera la DLL et son EXE appelant
    //   afin d'utiliser BORLNDMM.DLL en tant que gestionnaire de mémoire.  Dans ces cas,
    //   le fichier BORLNDMM.DLL doit être déployé avec votre DLL.
    //
    //   Pour éviter l'emploi de BORLNDMM.DLL, passez des informations chaîne par
    //   le biais de paramètres "char *" ou ShortString.
    //
    //   Si votre DLL utilise la version dynamique de la RTL, il n'est pas nécessaire
    //   d'ajouter explicitement MEMMGR.LIB car cela sera fait implicitement
    //---------------------------------------------------------------------------
     
    #pragma argsused
    extern __declspec( dllexport ) double Add (double a, double b);
    extern __declspec( dllexport ) double Subtract(double a, double b);
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    	return 1;
    }
    double Add (double a, double b)
    {
    	return a+b;
    }
    double Subtract(double a, double b)
    {
    	return a-b;
    }
    //---------------------------------------------------------------------------
    A l'utilisation de cette DLL sous Delphi j'obtiens l'erreur "Le point d'entrée de procédure Add est introuvable..."

    Qu'ai-je oublié ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'esit normal: __declspec(dllexport) indique qu'il s'agit d'un symbole qui doit être exporté (donc, typiquement lors de la compilation de la dll), alors que, pour utiliser la dll, il faut que le symbole en question soit... importé.

    Pour indiquer que le symbole doit être importé, il faudrait utiliser __declspec(dllimport) !!

    La solution la plus simple pour arriver à ce résultat est de passer par une directive préprocesseur conditionnelle qui prendrait la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ifdef BUILD_MYDLL
    #define MYDLL_API __declespec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #endif //BUILD_MYDLL 
    /* Nota : remplacer MYDLL par un nom permettant d'identifier la DLL de
     * manière unique serait une excellente idée :D
     */
    Ensuite, il s'agira donc de remplacer tous les __declspec(dllexport) par le symbole MYDLL_API, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern MYDLL_API double Add (double a, double b);
    extern MYDLL_API double Subtract(double a, double b);
    Note enfin que si le code que tu montre se trouve dans un fichier d'en-tête (*.h / *.hpp), il ne devrait pas contenir l'implémentation des fonction, qui devrait se trouver dans... un fichier d'implémentation (*.cpp)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Ok
    Un grand merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/11/2009, 20h39
  2. Développement piloté par les tests avec PHPUnit
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 18/11/2008, 19h53
  3. Développer des outils de test Google
    Par randriano dans le forum Référencement
    Réponses: 7
    Dernier message: 19/07/2008, 10h12
  4. développement Dll : DllRegisterServer()
    Par frizou11 dans le forum Windows
    Réponses: 4
    Dernier message: 16/05/2007, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo