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++Builder Discussion :

DLL sous C++ builder 6


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut DLL sous C++ builder 6
    Bonjour,
    Voici une partie du .h de mon exécutable que je dois transformer en DLL (sous C++ builder 6) :
    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
     
    #ifndef MODBUSTCPIP_H
    #define MODBUSTCPIP_H
     
    class CModbusTCPIP
    {
    public :
      CModbusTCPIP(void);
      ~CModbusTCPIP(void);
     
      bool Ouverture(const char FAR *ad);
      void Fermeture();
     
      bool ModbusLecturebit(unsigned short num, unsigned short adresse, int nb);
      bool ModbusLecturemot(unsigned short num, unsigned short adresse, int nb);
    private :
      void Lecturebit(unsigned short num, unsigned short adresse, int nb, BYTE *trame);
      void Lecturemot(unsigned short num, unsigned short adresse, int nb, BYTE *trame);
      bool InitWinsock2();
      bool CreationSocket();
    private :
      int sock;
      const char FAR* adresse;
    };
    #endif
    Je dois donc transformer mon programme en DLL. Si quelqu’un pouvez m’expliquer :
    - les étapes à suivre pour réaliser ma DLL sous c++ builder 6
    - comment appelle cette dll d’un nouveau projet
    Je sais qu’il existe une aide : http://lfe.developpez.com/DLL/ mais je n’ai pas tout compris. J’ai essayé de faire une DLL en suivant ses exemples mais je n’y suis pas arrivée.

    Quelqu’un pourrait me dire la différence entre une DLL statique et une DLL dynamique ? Pourquoi faire l’une plutôt que l’autre ? Ma DLL sera composée d’une classe, dois-je faire une DLL statique ou dynamique ?

    Merci Isabelle

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    une des technique dont tu peux trouver l'article complet à l'adresse suivante
    http://www.bcbdev.com/articles/vcdll2.htm#technique2
    est d'utiliser un pseudo com wrapper

    tu crée d'abord une classe interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef IMODBUSTCPIP_H
    #define IMODBUSTCPIP_H
     
    class ICModbusTCPIP
    {
    public :
       virtual bool Ouverture(const char FAR *ad)=0;
       virtual void Fermeture()=0;
      virtual  bool ModbusLecturebit(unsigned short num, unsigned short adresse, int nb)=0;
      virtual  bool ModbusLecturemot(unsigned short num, unsigned short adresse, int nb)=0;
     
    };
    #endif
    tu déclare ensuite une bouvelle clase d'implémentation pour ta classe interface

    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
     
    #ifndef MODBUSTCPIP_H
    #define MODBUSTCPIP_H
    #include "IMODBUSTCPIP.h"
    class CModbusTCPIP:public ICModbusTCPIP
    {
    public :
      CModbusTCPIP(void);
      ~CModbusTCPIP(void);
     
      bool Ouverture(const char FAR *ad);
      void Fermeture();
     
      bool ModbusLecturebit(unsigned short num, unsigned short adresse, int nb);
      bool ModbusLecturemot(unsigned short num, unsigned short adresse, int nb);
    private :
      void Lecturebit(unsigned short num, unsigned short adresse, int nb, BYTE *trame);
      void Lecturemot(unsigned short num, unsigned short adresse, int nb, BYTE *trame);
      bool InitWinsock2();
      bool CreationSocket();
    private :
      int sock;
      const char FAR* adresse;
    };
    #endif
    tu crée ensuite l'impémentation de cette classe (.cpp)

    on passe maintenant à la dll

    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
     
    // le .h 
    #ifndef DLLEXPORTS_H
    #define DLLEXPORTS_H
     
    #ifdef __dll__
    #define IMPEXP __declspec(dllexport)
    #else
    #define IMPEXP __declspec(dllimport)
    #endif 	// __dll__
     
    #include "MODBUSTCPIP.h"
    // on exporte les 2 méthodes suivantes
    extern "C"void* IMPEXP CreateClassInstance(); 
    extern "C"void IMPEXP RelesaseClassInstance(CModbusTCPIP * ptr);
    #endif	// DLLEXPORTS_H
     
    // l'implémentation .cpp
    //---------------------------------------------------------------------------
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #define __dll__
    #include "DllExports.h"
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
    {
            return 1;
    }
     
    void* IMPEXP CreateClassInstance()
    {
    	return static_cast< void* > (new CModbusTCPIP); // on retourne un pointeur sur instance de ta classe (un objet)
    }
    void IMPEXP RelesaseClassInstance(CModbusTCPIP * ptr)
    {
           delete ptr; // destruction de l'objet
    }
    //---------------------------------------------------------------------------
    n'oublie pas d'inclure ton fichier d'implémentation MODBUSTCPIP.cpp
    dans le projet de ta dll

    maintenant un petit programme de test
    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
     
    #pragma hdrstop
    #define WIN32_LEAN_AND_MEAN
    #include "IMODBUSTCPIP.h"
    #include "MODBUSTCPIP.h"
    #include <windows.h>
     
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
      HINSTANCE hdll = NULL;
      CModbusTCPIP* pClass = NULL;
      typedef void* (__stdcall *pvFunctv)();
      typedef void (__stdcall *pvReleaseFct)(CModbusTCPIP* );
      pvFunctv CreateCmod;
      pvReleaseFct ReleaseCmod;
      hdll = LoadLibrary("MainDll.dll");		// load the dll
      CreateCmod= (pvFunctv)GetProcAddress( hdll, "_CreateClassInstance" ); // chargement de la fonction
      ReleaseCmod= (pvReleaseFct)GetProcAddress( hdll, "_RelesaseClassInstance" );
      pClass = (CModbusTCPIP* *)CreateCmod() ;	// get pointer to object
      //
     // code d'utilisation de ta classe avec le le pointeur pClass
     //
      ReleaseFoo((CModbusTCPIP*)pClass);    // delete the object
      FreeLibrary(hdll);				// free the dll
     return 0;
    }
    et voila
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Il n'existe pas une solution plus facile car là je ne comprend pas tout.

    Pourquoi doit-on passer par une classe Interface ?
    Pourquoi faut-il créer les 2 fonctions suivantes : CreateClassInstance et ReleaseClassInstance ?

    J'ai essayé ton code mais le programme bug à la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pClass=(CModbusTCPIP*)CreateCmod();
    rmq : CreateCmod et ReleaseCmod sont à NULL.

    Merci
    Isabelle

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    si
    CreateCmod et ReleaseCmod sont à NULL.
    cela signifie que
    soit ta dll n'exporte pas de fonction
    ou que le chargement de la fonction est défectuex
    dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    hdll = LoadLibrary("MainDll.dll");      // load the dll
      CreateCmod= (pvFunctv)GetProcAddress( hdll, "_CreateClassInstance" ); // chargement de la fonction
      ReleaseCmod= (pvReleaseFct)GetProcAddress( hdll, "_RelesaseClassInstance" );
    CreateClassInstance sert à te retourner un poinetur sur une instance de ta classe
    RelesaseClassInstance sert à libérer la mémoire après lutilisation de l'object

    ps:
    si tu ne trouve pas tu peux m'envoyer un MP avec ton code
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. DLL Delphi pour utilisation sous C++ Builder
    Par kurul1 dans le forum Langage
    Réponses: 8
    Dernier message: 25/06/2008, 10h54
  2. Debug de dll sous C++ Builder
    Par Négrier dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/09/2005, 19h12
  3. Enrgistrer une dll sous IIS
    Par jeff37 dans le forum ASP
    Réponses: 2
    Dernier message: 12/07/2004, 17h23
  4. dll sous cygWin
    Par victorracine dans le forum C
    Réponses: 10
    Dernier message: 31/07/2003, 11h33
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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