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 :

Appel d'une fonction C++ par une DLL en C


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Appel d'une fonction C++ par une DLL en C
    Hello,

    J'aimerais appeler, à partir d'une DLL codée en C, une fonction dans une autre DLL en C++.

    Comment ça se passe ?

    Je précise que je n'ai jamais fait de code où une DLL appelle une fonction d'une autre DLL (quel que soit le langage).

    Je suis conscient que ma question est un peu primaire, mais je ne sais pas où/comment chercher une telle information.

    Tout lien sera bienvenu pour une intro !

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Eh bien, ça peut se faire de trois façons:
    • Statiquement, avec la fonction déclarée extern "C" dans le source et en-tête C++.
    • Dynamiquement, en passant un pointeur de fonction à la DLL C.
    • Encore plus dynamiquement, la méthode COM: On utilise en C une structure qui reproduit les fonctions virtuelles C++, et on appelle avec ça.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Merci.

    Citation Envoyé par Médinoc Voir le message
    Eh bien, ça peut se faire (...) en passant un pointeur de fonction à la DLL C.
    C'est celle-ci qui semble correspondre à mon besoin.

    Dois-je faire quelque chose de spécial dans le code C++ pour que la fonction dont je passe le pointeur soit visible ? Publique, j'imagine, mais encore ?

    Et comment puis-je en C récupérer ce pointeur ?

    Pour info, je suis en train de lire ce didacticiel...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Le principal prérequis, c'est que la fonction soit libre (ou statique).

    En clair, comme pour les threads:
    Code C : 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
    /* MaDLL.h */
    #include <stddef.h>
     
    typedef int (*FONCTION_CALLBACK)(intptr_t user, int a, int b);
     
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    #ifndef MADLL_API
    #ifdef MADLL_EXPORTS
    #define MADLL_API __declspec(dllexport)
    #else
    #define MADLL_API __declspec(dllimport)
    #endif
    #endif
     
    EXTERN_C void MADLL_API FonctionQuiPrendUnCallback(FONCTION_CALLBACK pf, intptr_t user);
    Code C++ : 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
    // CodeCpp.cpp
     
    #include "MaDll.h"
     
    class UneClasse
    {
    private:
    	int FonctionCallback(int, int);
    	static int SFonctionCallback(intptr_t, int, int);
    public:
    	void AppelFonctionDll(void);
    };
     
    int UneClasse::SFonctionCallback(intptr_t user, int a, int b)
    {
    	UneClasse *this = reinterpret_cast< UneClasse * >(user);
    	return this->FonctionCallback(a, b);
    }
     
    void UneClasse::AppelFonctionDll(void)
    {
    	FonctionQuiPrendUnCallback(SFonctionCallback, reinterpret_cast<intptr_t>(this));
    }

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ben écoute, ça m'a l'air nickel.

    Je te remercie beaucoup !

    Je vais implémenter ça, et attaquerai le portage Linux par la suite. :-)

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 09h06
  2. Appel d'une séquence sonore par une fonction
    Par Henri dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 05/11/2007, 02h55
  3. Envoyer une valeur génerée par une fonction javascript
    Par karimphp dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/12/2006, 19h44
  4. [SQL] php et recuperation d'une valeur renvoyée par une fonction sql
    Par highman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2006, 16h42
  5. Réponses: 11
    Dernier message: 31/10/2005, 18h59

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