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 :

Appel d'une fonction global à partir d'une DLL


Sujet :

C++Builder

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Appel d'une fonction global à partir d'une DLL
    Bonjour,

    J'ai besoin d'appeler une Fonction Global getter à partir d'une DLL
    Comment dire au Linker que la fonction est à aller chercher dans le main?
    Merci de répondre: ce sera

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    ci joint exemple de déclaration à mettre dans ton .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllimport) int __stdcall Global_getter(char *Data, int *Len, char *Test);
    tu dois aussi lier ta librairie en mettant le xxx.LIB correspondant à ta DLL xxx.DLL dans ton code ou faire un #pragma link "xxx.lib" il me semble

    il y a des tutos la dessus il me semble.

    ça c'est le plus simple mode statique, il y a aussi le chargement et déchargement dynamique ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HINSTANCE hinstDLL; 
    hinstDLL=LoadLibrary("xxx.dll" ); 
    ...
    FreeLibrary(hinstDLL);
    regarde ici:

    http://lfe.developpez.com/DLL/#L3

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Salut,

    Si j'ai bien compris, c'est la fonction de la DLL qui doit rappeler une fonction de ton programme principal?

    Si c'est ça, alors il faut que tu définisses la signature de cette fonction de callback dans ta DLL et définir un paramètre dans ta DLL pour lui passer l'adresse de la fonction de callback.

    dans 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
     
    // Définition de la signature que doit avoir la fonction de callback
    // appelé par la DLL (ici accepte un int comme paramètre et ne 
    // retourne rien)
    typedef void (*myCallbackFunctionType)(int toto);
     
    // La fonction de la DLL qui appelera le callback du main
    void PACKAGE MyDLLFunction(myCallbackFunctionType callback) {
     
      int a=12;
     
      // Appel de la fonction de callback (attention, le parametre est un 
      // pointeur qui peut être NULL)
      if (callback) {
        callback(a);    // l'appel proprement dit
      }
    }
    Dans ton main:
    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
     
    // Définition de la fonction de callback qui doit avoir la même
    // signature que celui déterminé dans la DLL
    void MyCallback(int value) {
     
      cerr<<"Hello, la valeur est: "<<value<<endl;
     
    }
     
    // Appel de la fonction de la DLL (Fbartolo t'a indiqué comment 
    // appeler la DLL)
    void main(int argc, char *argv[]) {
     
      // Charger la DLL
      HINSTANCE hinstDLL;
      hinstDLL=LoadLibrary("Project1.dll"));
     
      // Définition des types
      typedef void (*myCallbackFunctionType)(int toto);
      typedef void (*MyDLLFunctionType)(myCallbackFunctionType);
     
      // Trouver l'adresse de la fonction dans la DLL
      if (hinstDLL) {
        MyDLLFunctionType dllFunction=GetProcAddress(hinstDLL,"MyDLLFunction");
     
         // Appeler la fonction avec son callback
        if (dllFunction) {
          dllFunction(&MyCallback);
        }
      }
    }
    Maintenant tu peux avoir à ajouter des __closure si ta fonction de callback est dans une classe et des __fastcall si tu veux (pas obligatoire) à tes signatures de fonction.

    Je n'ai pas testé ce code et il peut donc contenir encore quelques erreurs, dis-moi si ça ne marche pas

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Oups désolé, j'avais pô vu que c'était un call back qui était demandé, effectivent l'idée est de fournir à la DLL l'adresse mémoire de ta fonction avec le bon prototype connu de ton main et de la DLL.

  5. #5
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Les exemples?
    Bonjour
    D'abord, je vous remercie pour vos réponses bien documentées.
    Ensuite je me pose la question de d'écriture des exemples: est ce du C ou du C++, prend t'on les mêmes méthodes dans les deux cas.
    merci de m'apporter ces précision, ce sera

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Salut,

    J'ai fait un exemple en C car tu parlais d'aller dans le main. Maintenant, pour les accès à la DLL, c'est la même chose en C++. Il y a juste une différence dans la signature de la fonction de callback si la fonction se trouve dans une classe: tu doit ajouter le mot-clé "__closure" comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef void (__closure *myCallbackFunctionType)(int toto);

  7. #7
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Bonjour
    Bonjour,

    Merci à tous pour l'ensemble des réponses qui vont me faire réussir.
    Je ne peux pas la tester aujourd'hui car j'ai d'autres priorités.
    Je conserve l'accès à toutes ces informations et je reviendrai vers le site pour documenter la solution qui marchera.
    Je met résolu, car je pense que les réponses sont suffisantes dans l'état et je fournirai la solution implémentée plus tard.

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

Discussions similaires

  1. [CS5] Déclarer une variable global à partir d'une fonction
    Par Stalk3R dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 09/04/2012, 17h09
  2. Réponses: 3
    Dernier message: 16/04/2009, 08h34
  3. Réponses: 5
    Dernier message: 17/05/2008, 13h15
  4. Réponses: 2
    Dernier message: 06/03/2008, 21h20
  5. Appeler une nouvelle fenetre à partir d'une fonction callback
    Par foxyman dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 02/02/2007, 18h42

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