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

Windows Discussion :

[DLL] Symboles non resolus


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut [DLL] Symboles non resolus
    Bonjour,
    Je suis en train de chercher depuis pas mal de temps voir si il etait possible de creer une dll utilisant des fonctions qui seront definis par celui qui le load ?

    Typiquement, prenons un serveur web qui charge des plugins, je veux qu'il puisse proposer des fonctions de base (Genre acces aux fichiers, reseau ....) que mes dll pourront utiliser.

    Mais est ce possible ? Si oui comment ?

    Le but etant bien sur de pouvoir charger une dll sans avoir besoin de recompiler le serveur avec ou de trimballer des .lib ....

    Sous un unix-like ya pas de soucis, les symboles non definis sont resolu par le chargeur de programme a l'execution, mais sous windows la dll ne passe meme pas le stade de la compilation.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il y a bien un truc pour les références croisées entre DLLs, mais pour les EXE, je pense que le mieux est encore le passage de fonctions callback en paramètre.
    Tu peux proposer toute une "interface" en callback si tu veux; c'est très courant quand on programme avec COM, mais ça peut se faire sans aussi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    Oui c'est mon autre solution mais ca me parraissait tellement aberrant de devoir faire une interface et la passer aux fonctions de ma DLL ...

    Merci pour ta reponse

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Mets les services "de base" dans une DLL, qui sera utilisée aussi bien par ton programme principal que par les DLL annexes. C'est le plus simple et le plus propre.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    C'est aussi une solution mais ca demande de devoir distribuer le .lib et companie.

    C'est dans le cadre d'un projet nous demandant de faire un serveur web modulaire multi plateforme. Les modules doivent etre portable au sein de la promo (l'API n'a pas encore ete definis, elle doit etre vote, toussa toussa ...) .

    Je pense que le systeme d'interface est le plus simple.

    Ceci dit l'idee est interressante, merci

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par daedric Voir le message
    C'est aussi une solution mais ca demande de devoir distribuer le .lib et companie.
    Gni ? Pourquoi donc ? Tu peux charger les fonctions en mode JIT, aussi, et donc ne pas avoir besoin de librairie d'importation... Ou tu peux fournir le code d'importation dans une classe définie à 100% dans le .H correspondant à ta librairie "de base", ce qui rend donc son utilisation aussi complexe que d'inclure un .H et d'instancier une classe.
    De toutes façons, tu dois déjà distribuer les entêtes de l'API d'interface, donc un peu plus ou un peu moins, je ne vois vraiment pas ce que ça change.

    Citation Envoyé par daedric Voir le message
    C'est dans le cadre d'un projet nous demandant de faire un serveur web modulaire multi plateforme. Les modules doivent etre portable au sein de la promo (l'API n'a pas encore ete definis, elle doit etre vote, toussa toussa ...) .
    Si tu comptes faire un truc portable, déjà, c'est mal barré avec les librairies dynamiques : leur comportement est assez différent entre Linux et Windows, Linux ne connaissant pas la notion de ressources et Windows considérant les DLL comme des exécutables linkés à 100%...
    Bref, tu risques d'avoir un problème insoluble dû au fait que les deux OS n'ont pas la même définition d'une "librairie dynamique".

    La problématique "plugin" est loin d'être simple, et la rendre portable est en général encore plus complexe.

    Citation Envoyé par daedric Voir le message
    Je pense que le systeme d'interface est le plus simple.
    Plus simple ? Bof... Cela oblige à passer des paramètres en plus à chaque fonction, à gérer les cas d'absence des dites callbacks, à multiplier les déclarations de type fonctionnels, et tu vas rigoler sur la recherche des bugs quand tu te seras trompé de callback. C'est une méthode de programmation qui marche très bien pour des éléments "bas niveau", mais qui montre vite ses limitations sur un code complexe.

    L'avantage d'avoir une DLL "bas niveau" partagée entre le programme et les "plugins" du programme, c'est que cette librairie est testable de façon unitaire, et qu'elle sera (à peu de choses près) le seul élément du système contenant du code non-portable, ce qui est loin d'être négligeable. La méthode des callbacks va rendre le code non-portable "tentaculaire" et le disperser dans TOUT le code source, ce qui n'est pas franchement une excellente idée en soi.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Gni ? Pourquoi donc ? Tu peux charger les fonctions en mode JIT, aussi, et donc ne pas avoir besoin de librairie d'importation...
    Je ne vois pas comment tu pourrais faire ? Ca resoud pas le probleme comme quoi les dll sont linkees entierement

    Citation Envoyé par Mac LAK Voir le message
    Ou tu peux fournir le code d'importation dans une classe définie à 100% dans le .H correspondant à ta librairie "de base", ce qui rend donc son utilisation aussi complexe que d'inclure un .H et d'instancier une classe.
    De toutes façons, tu dois déjà distribuer les entêtes de l'API d'interface, donc un peu plus ou un peu moins, je ne vois vraiment pas ce que ça change.
    Oui ce n'est pas le soucis.



    Citation Envoyé par Mac LAK Voir le message
    Si tu comptes faire un truc portable, déjà, c'est mal barré avec les librairies dynamiques : leur comportement est assez différent entre Linux et Windows, Linux ne connaissant pas la notion de ressources et Windows considérant les DLL comme des exécutables linkés à 100%...
    Bref, tu risques d'avoir un problème insoluble dû au fait que les deux OS n'ont pas la même définition d'une "librairie dynamique".

    La problématique "plugin" est loin d'être simple, et la rendre portable est en général encore plus complexe.
    On est d'accord, je m'en serais passe mais je n'ai pas le choix.


    Citation Envoyé par Mac LAK Voir le message
    Plus simple ? Bof... Cela oblige à passer des paramètres en plus à chaque fonction, à gérer les cas d'absence des dites callbacks, à multiplier les déclarations de type fonctionnels, et tu vas rigoler sur la recherche des bugs quand tu te seras trompé de callback. C'est une méthode de programmation qui marche très bien pour des éléments "bas niveau", mais qui montre vite ses limitations sur un code complexe.
    Je vois pas ce que ca change concretement entre le fait de passer une interface a une fonction externe d'une dll et le fait que la-dites dll aille piocher elle meme les fonctions dont elle a besoin dans une autre dll.
    C'est justement les fonctionnalitees bas niveau que je voulais que la dll aille recuperer dans le serveur.

    Citation Envoyé par Mac LAK Voir le message
    L'avantage d'avoir une DLL "bas niveau" partagée entre le programme et les "plugins" du programme, c'est que cette librairie est testable de façon unitaire, et qu'elle sera (à peu de choses près) le seul élément du système contenant du code non-portable, ce qui est loin d'être négligeable. La méthode des callbacks va rendre le code non-portable "tentaculaire" et le disperser dans TOUT le code source, ce qui n'est pas franchement une excellente idée en soi.

    En fait je sais pas si on s'est entierement compris.
    La dans l'etat actuel des choses on a toutes le code non portable realise avec un ensemble d'interface fonctionnant quelque soit la plateforme.

    Maintenant il nous manque le gestionnaire de module, on est assez famillier du monde unix mais sous windows on a ete surpris par leurs dll.
    On pensait faire le serveur de maniere a ce qu'il propose des fonctions externes pour les fonctionnalitees bas niveau.

    Et comme tout semble confirmer qu'on ne peut pas avoir de symboles non resolus, on pensais faire en sorte que les fonctions externes de la dll (et so) prennent en parametres un pointeur sur une interface.

    Je vois pas en quoi cela rendrait le code plus tentaculaire.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par daedric Voir le message
    Je ne vois pas comment tu pourrais faire ? Ca resoud pas le probleme comme quoi les dll sont linkees entierement
    Parce que le JIT (Just-In-Time) est un vrai chargement DYNAMIQUE, résolu à l'EXÉCUTION du code correspondant, et non pas réalisé lors de la construction de l'image en mémoire de l'exécutable (=ce qui est fait avant l'appel du main).

    Citation Envoyé par daedric Voir le message
    Je vois pas ce que ca change concretement entre le fait de passer une interface a une fonction externe d'une dll et le fait que la-dites dll aille piocher elle meme les fonctions dont elle a besoin dans une autre dll.
    Interface : des paramètres en plus pour tes fonctions, pour commencer, et la quasi-impossibilité de tester correctement les fonctions bas niveau.
    JIT : pas de problème de dépendance circulaire, les entêtes de la DLL peuvent contenir le code d'importation correspondant, et la DLL toute entière peut être testée intensivement de façon autonome.

    Citation Envoyé par daedric Voir le message
    C'est justement les fonctionnalitees bas niveau que je voulais que la dll aille recuperer dans le serveur.
    C'est pour ça que je te parle d'une DLL "bas niveau" pour les stocker. On peut, théoriquement, se linker à des fonctions d'un exécutable comme si c'était une DLL. En pratique, c'est franchement loin d'être gagné.

    Citation Envoyé par daedric Voir le message
    Et comme tout semble confirmer qu'on ne peut pas avoir de symboles non resolus, on pensais faire en sorte que les fonctions externes de la dll (et so) prennent en parametres un pointeur sur une interface.

    Je vois pas en quoi cela rendrait le code plus tentaculaire.
    Parce que tu vas "répandre" des références à ces fonctions dans tout le code, notamment lors des appels de fonction, au lieu de les centraliser à un endroit donné (ex : la fonction "WriteToFile" de la DLL bas niveau). Et que le jour où tu dois faire évoluer une de ces fonctions, tu risques de trouver moins drôle d'éplucher tout le code source pour vérifier les références.

    Même si la fonction reste "unique", elle est située dans un exécutable, et reste donc non testable de façon unitaire sans modifier le programme les contenant... Ce qui peut (en pratique, "va") introduire des régressions entre le comportement nominal et le comportement en test.

    Alors que dans une DLL, tu peux remplacer / corriger une fonction bas niveau sans même avoir besoin de recompiler les programmes qui l'utilisent...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    Le JIT ca me parait un peu dur de la faire a la main dans le temps imparti
    Et dur tout cours meme.

    Pour le fait de placer tout le code bas niveau dans une dll au final ca reviens a ce que tout soit dans l'application 'mere' ce qui est actuellement fait.
    C'est vrai que pour les tests c'est moins evident mais les tests unitaires sont deja fait pour chacune des classes.

    Je pense que les fonctions exportees des dll recevront une interface en parametres. Ca reste le plus simple et le plus malleable.


    Sinon merci pour tes reponses.
    On verra bien ce que ca donne .

    Desole pour le retard de la reponse j'ai pas recu le mail de notif de reponse

Discussions similaires

  1. [C][DLL] Exportation de symboles NON décorés
    Par David.Schris dans le forum Code::Blocks
    Réponses: 2
    Dernier message: 04/03/2008, 16h56
  2. Réponses: 4
    Dernier message: 17/03/2007, 19h11
  3. [Débutant]Erreur Symbole non défini
    Par sitirna dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2006, 11h06
  4. symbole Non déclaré/D6/Xp pro/
    Par Lucien dans le forum Delphi
    Réponses: 2
    Dernier message: 13/05/2006, 08h41
  5. [VB.NET] Bug de dll : référence non trouvée
    Par boulete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/04/2006, 10h13

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