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 :

Partager une fonction entre DLL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Par défaut Partager une fonction entre DLL
    Bonjours! Pour alléger un projet, je sépare mes fonctions dans des DLLs. Seulement, certaines fonctions sont du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int foo(int &x)
    {
        /*...*/
        bar(x)
        /*...*/
    }
    où x est une variable de l’exécutable et où bar est utilisé dans l'exécutable et dans d'autres DLLs.
    Plusieurs solutions s'offrent alors (liste non-exhaustive):
    1. Déclarer la fonction void bar(int &y) dans chaques DLLs et dans l'exe.
      Problème: Ce n'est pas du tout optimisé pour un gain de mémoire.
    2. Déclarer la fonction void bar(int &y) dans une DLL et l'importer dans toutes les autre.
      Problème: Cela fait beaucoup de dépendances et complique la relecture.
    3. Déclarer la fonction void bar(int &y) dans l'exe mais l'appeler à partir de la réception d'un message spécifique envoyé à un HWND comme suggéré ici.
      Problème: Pour passer plusieurs paramètres il faut soit utiliser une structure soit un tuple (à choisir je préfère le tuple, ça allège, mais c'est en C++11).
    4. Déclarer la fonction void bar(int &y) dans l'exe et l'utiliser dans les DLLs.
      Problème: Je ne sais absolument pas si c'est possible.


    Si vous avez déjà été confrontés à cette situation, ou si vous avez une idée, pouvez-vous me faire part de votre méthode?

    Merci,

    Simac

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Salut!

    Je suppose que tu construis tes DLLs en regroupant les fonctions par type de fonctionnalités?
    Du coup, "bar" devrait se trouver avec la DLL "fonctionnalités génériques", non?

    En tout cas, ça me paraît louche, cette histoire d'allègement de projet par découpage en DLL...
    Quel est le contexte?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Je suis d’accord avec @dragonjoker59, la solution 2 est largement la meilleur.
    On appelle cela la "levelisation" des modules.

    Cela fait beaucoup de dépendances et complique la relecture.
    Absolument pas, bien au contraire, cela ne fait que souligner les faiblesses intrinsèques de votre conception et donne un cadre clair pour les corriger.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    La 4ème fonctionne, c'est peu courant mais une dll peut dépendre de l'exe

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Par défaut
    Merci à tous de m'avoir répondu !

    Il est en effet logique de mettre les fonctions partagées dans une DLL commune, mais qu'en serai-il des fonctions «récursives», par exemple la fonction bar qui appelle la fonction foo ? Il faut donc revoir le code pour les éviter ?

    Citation Envoyé par dragonjoker59
    En tout cas, ça me paraît louche, cette histoire d'allègement de projet par découpage en DLL...
    Quel est le contexte?
    L'utilisation des DLLs n'est pas directement lié à l'allègement du projet, j'ai mal exposé le contexte.
    En fait, je suis entrain de reprendre un programme que j'avais écrit en un seul fichier (ou presque) pour le rendre plus lisible et moins long à la compilation. Les DLLs ne sont là que pour permettre de possibles mises à jour.

    Citation Envoyé par dalfab
    La 4ème fonctionne, c'est peu courant mais une dll peut dépendre de l'exe
    C'est donc à n'utiliser que en dernier recours, mais comment fait-on ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    mais qu'en serai-il des fonctions «récursives», par exemple la fonction bar qui appelle la fonction foo
    Ce cas de figure montre une erreur de conception.
    Les Dll et l'exécutable doivent former un arbre ou un graphe sans cycle.
    L'exécutable est le point de départ, la racine, il utilise des dll de haut niveau (avec un grand niveau d'abstraction).
    Les dll de haut niveau utilisent des Dll de plus bas niveau pour implémenter leurs fonctionnalités de haut niveau.
    etc...
    L'exécutable pourra aussi utiliser les Dll de bas niveau pour implémenter des propres fonctionnalités.
    Mais il est complètement illogique que des Dll de bas niveau, qui doivent donc être utilisables par des Dll de plus haut niveau, utilisent les Dll de plus haut niveau.

    Donc, si, légitimement "foo" peut appeler "bar" qui lui-même peut appeler "foo", c'est qu'ils utilisent les mêmes concepts et les mêmes fonctionnalités et donc qu'ils doivent être dans la même Dll.
    Mais, bon, ce genre de récursion est souvent suspecte.

    Il faut donc revoir le code pour les éviter ?
    très souvent, oui.

    Si vous découpez votre programme en modules les plus indépendants les uns des autres, vous n'aurez pas grand-chose comme dépendance.

    C'est donc à n'utiliser que en dernier recours, mais comment fait-on ?
    Un exe, c'est comme une Dll, ça peut exporter des symboles et donc on peut forger une librairie (de dll) avec ses symboles.
    Vous donnez cette pseudo librairie à manger au linker lors de la compilation de la Dll.
    Mais bon, là, c'est vraiment pour faire le kéké et créer des applications toutes moisies complètement immaintenable.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2006, 11h44
  2. Réponses: 12
    Dernier message: 14/08/2006, 12h55
  3. Réponses: 7
    Dernier message: 06/04/2006, 18h17
  4. Partager une version entre plusieurs DLL
    Par barthelv dans le forum MFC
    Réponses: 4
    Dernier message: 22/11/2005, 10h25
  5. Réponses: 6
    Dernier message: 24/12/2004, 16h46

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