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 :

échange entre progamme et DLL


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut échange entre progamme et DLL
    Bonjour,

    Voila Je suis débutant et j'aimerai modifié un petit programme en isolant la partie com dans une dll, seulement cette partie que je souhaite isoler a besoin de classes que je souhaite laisser dans mon programme principale.
    Je voudrais donc savoir si le sens de communication se fai uniquement de la dll vers le programme ou bien si il peu se faire du programme vers la dll.

    plus precisement, comment puis-je faire connaitre à une dll des classes se situant dans le programme ?

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,
    si votre post parle de COM, je suppose que vous développez sous Windows.
    Normalement, votre programme principal doit générer une librairie statique qui devra être lier à votre DLL, afin que celle-ci puisse accéder aux classes du programme principal.
    Il vous faudra définir précisément les classes affectées, et utiliser le mot clef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _declspec(dllimport)  ou _declspec(dllexport)
    Je ne suis pas suffisamment à l'aise avec cette technologie pour vous en dire davantage.

    S. Desbois

  3. #3
    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
    La DLL ne pourra jamais connaître le nom des fonctions exposées par le programme de toute façon. Il faudra donc passer à la DLL des pointeurs de fonction, ou des objets de classes héritant d'une classe commune dont toutes les fonctions sont virtuelles.

    C'est ainsi que fonctionne COM/OLE, d'ailleurs: Une "Interface COM", ce n'est rien de plus qu'une classe dont toutes les fonctions sont virtuelles pures.
    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.

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Donc en passant à la dll des pointeur sur des fonction du programme, celle ci pourra utiliser ces fonctions??

  5. #5
    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
    Oui.
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    tout d'abord merci de votre aide !!!
    Pourriez vous me dire comment passer un pointeur de fonction a la dll?
    lors de lappelle du constructeur de l'interface de la dll ??

    encore merci!

  7. #7
    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
    Pour commencer, il faut choisir: Soit on passe uniquement des pointeurs de fonction, soit on joue avec une "interface" et des objets. Ce n'est pas du tout la même envergure.

    Pour bêtement passer un pointeur de fonction à une DLL, tu regarde simplement comment on utilise des fonctions comme DialogBoxParam(), EnumWindows(), CreateThread(), etc. Ces fonctions sont dans USER32.DLL et prennent toutes un pointeur de fonction en paramètre. Pour des fonctions qui n'appellent pas la fonction passée AVANT leur retour, tu peux regarder du coté de la structure WNDCLASSEX qui, utilisée avec RegisterClassEx(), se contente de mémoriser le pointeur pour plus tard sans l'appeler immédiatement...
    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.

  8. #8
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par GEIIMAN
    lors de lappelle du constructeur de l'interface de la dll ??
    Là j'ai pas tout compris ... plutôt l'interface d'un objet COM ?
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  9. #9
    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
    On peut jouer avec des "interfaces" sans nécessairement faire du COM/OLE...
    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.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    pour mchk0123:

    lors de lappelle constructeur de l'interface cad est ce ke je peu passer en argument au constructeur de la classe interface de ma dll,le pointeur sur la fonction du programme que ma dll doit utiliser.

    Merci medinoc je vai chercher dans ce sens la

  11. #11
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Oui, comme medinoc te l'as dit, il n'y a aucun problème à passer un pointeur de fonction dans les paramètres de ton constructeur situé dans la Dll.

    Fait tout de même attention à ce que la DLL et ton programme soient, tous les deux, compilés avec le même compilateur & les mêmes options de compilations.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  12. #12
    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
    Pour des pointeurs de fonctions C ou extern "C", pas de problème à priori : Les conventions d'appel sont standardisées sous Win32.

    Un éventuel problème peut avoir lieu si le header ne précise pas explicitement la convention d'appel (__cdecl, __stdcall (WINAPI et CALLBACK sont des defines dessus) ou __fastcall), car les options de compilation déterminent celle qui est choisie par défaut.
    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.

  13. #13
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Tu devrai crée une DLL COM. Tu trouveras quelque exemple sur le net http://www.codeproject.com/com/comintro.asp.

    En gros tu crée des interfaces définis dans un fichier idl. Une interface est une classe avec des functions virtuel pure (aucun code attaché). Après tu implémente c'est interface dans une classe, à la sauce COM. C'est assez galère a comprendre au début mais on si fait. Ta DLL doit aussi exporter 3 ou 4 fonction d'enregistrement. Et l'astuce c'est que tout le monde peut avoir accès au définitions des IDL, sans même savoir ou le code correspondant ce trouve!
    Le bon coté c'est que tu pourras utilisé ton module dans d'autre languages ( C#/Java/VBS)

    Bon chance
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  14. #14
    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
    Je pense que mettre en branle tout COM juste pour ça est exagéré.
    Si c'est juste pour passer des fonctions ou une classe à une DLL, il n'est pas forcément nécessaire d'ajouter le comptage de références, le cast dynamique d'une interface à l'autre, etc.
    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.

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut résolu
    ca y est jai réussi, ma dll utilise la fonction de mon programme que je voulai.
    je lui est passer un pointeur sur cette fonction et aucun probleme jai verifié avec le debuger,elle execute bien le code de cette fonction.

    merci à tous pour vos conseilles

  16. #16
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par mchk0123
    Fait tout de même attention à ce que la DLL et ton programme soient, tous les deux, compilés avec le même compilateur & les mêmes options de compilations.
    Mes excuses medinoc je croyais qu'il voulait passer un pointeur sur une interface ou objet casté en classe abstraite, alors qu'en fait il veut passer un simple pointeur sur fonction.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  17. #17
    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
    Mais même pour une simple interface/classe abstraite, je pense que mobiliser COM était exagéré.
    Pour quelque chose de plus gros, ça aurait pu être intéressant. Et encore, seulement des objets COM, inutile d'aller jusqu'à des composants...

    (un objet COM n'a pas de ClassFactory)
    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.

  18. #18
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    On s'est mal compris, je parlais des options de compilations. J'ai corrigé mon message plus haut.
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  19. #19
    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
    Au temps pour moi, c'est themaxmax qui parlait de créer une DLL COM...
    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.

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

Discussions similaires

  1. pb passage de données entre Appli et DLL
    Par Bobx dans le forum Delphi
    Réponses: 12
    Dernier message: 29/12/2006, 00h09
  2. Différences entre .lib et .dll
    Par oodini dans le forum Windows
    Réponses: 3
    Dernier message: 05/12/2006, 18h12
  3. échange entre select multiple
    Par mgemc2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/08/2006, 15h15
  4. communication entre un projet DLL et une application
    Par ferry.jules dans le forum C++Builder
    Réponses: 95
    Dernier message: 22/05/2006, 20h06
  5. visualiser les points d'entrée d'un dll
    Par DenisLorrain dans le forum Windows
    Réponses: 4
    Dernier message: 06/07/2004, 00h20

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