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 de DLL en C++


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut appel de DLL en C++
    Bonjour à tous

    J’essaie depuis deux jours d'appeler en C++ une fonction contenue dans une DLL que j'ai créé avec Delphi (environnement dans lequel je réalise des modèles de machine afin de les simuler). J’ai trouvé quelques exemples mais impossible de faire ce que je souhaite.

    Dans un premier temps, je souhaiterai juste faire appel à une fonction contenue dans une DLL créé sous Delphi, qui effectue une addition de deux nombres double.

    Ensuite, je pense pouvoir en tirer la méthode pour mon travail, qui consistera à appeler une procédure (modèle de machine thermique) contenue dans une DLL que j’ai réalisé sur Delphi.

    Je dois pouvoir l’appeler depuis C++ car mon modèle est destiné à fonctionner avec un logiciel qui fonctionne principalement avec le langage C++.

    petite précision le logiciel créé ensuite lui meme une DLL, donc nous aurons une DLL en C++ qui fera appel à une DLL Delphi.

    J’espère que quelqu’un pourra m’aider.
    Merci d’avance pour votre aide

  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
    Est-ce une fonction nue que tu exportes?
    Quel compilo C++ utilises-tu?
    Delphi génère-t-il un autre fichier que le .dll (un .lib par exemple) ?
    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
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    qu'est ce que vous entendez par nue
    dans un premier temps je voudrai simplement le faire avec une fonction addition à laquelle je donne deux nombres et elle me renvoie la solution

    sinon j'utilise microsoft visual studio
    et delphi ne génère qu'un .dll pas de .lib

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut veuxche,

    Le pascal n'utilise pas les paramètres des fonctions DLL de la même façon que les autres langages (comme le C++). Il va les inverser donc provoquer une erreur d'exécution si tu n'as pas codé ta fonction à l'intérieure de ta librairie DLL pour qu'elle soit compatible.

    Pour ce faire, tu dois spécifier le mot clé "stdcall;" au bout des fonctions que tu veux exporter.

    Il existe aussi d'autres subtilités à ne pas omettre lorsque l'on veut partager des librairies DLL entre le pascal et le C++, comme entre autre l'utilisation des chaines de caractères dans les paramètres, etc...

    Je t'invite à consulter l'excellent tutoriel d'Olivier Danhan qui traite de toutes les subtilités à tenir compte pour ce besoin très précis.

    http://www.eyrolles.com/Chapitres/9782212111439/19.pdf

  5. #5
    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
    Et pour le reste, il te faudra passer par les fonctions LoadLibrary / GetProcAddress / FreeLibrary pour importer ta fonction Delphi en C++.
    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

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    merci de vos réponses mais je n'arrive toujours pas à réaliser cet appel
    j'ai pourtant un exemple très détaillé que j'ai trouvé sur internet

    http://www.esanu.name/delphi/DLL/Cal...isual%20C.html

    j'ai donc essayé dans une premier temps de m'en inspirer pour appeler la dll suivante que j'ai créé sous delphi

    library somme;

    uses
    SysUtils,
    Classes;

    {$R *.RES}

    function ajout(a,b:double):double stdcall;
    begin
    ajout:=a+b;
    end;

    exports
    ajout index 1 name 'ajout@4';
    begin
    end.

    mais rien à faire

    ensuite j'ai créer la dll delphi de cet exemple et copier le language en c++ et essayer d'appeler la fonction plusone dans le programme où j'ai besoin de faire cet appel mais ca ne marche toujours pas
    aussi faut voir la complexité du truc par rapport à l'appel de dll sous delphi et visual basic application
    donc est ce que quelqu'un pourrait m'expliquer comment je peux le faire avec les commentaires qui vont bien ça serait super sympa
    merci

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Bonjour,

    Ça fait très longtemps que je n'ai pas fait de Delphi, mais le nombre après le '@' dans ta clause exports n'est-il pas sensé indiquer la taille totale des paramètres de ta fonction ? Si c'est le cas, essaies avec ajout@16.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  8. #8
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Et pour le reste, il te faudra passer par les fonctions LoadLibrary / GetProcAddress / FreeLibrary pour importer ta fonction Delphi en C++.
    Pas forcément. Tu peux aussi aussi recréer le .lib à partir de la DLL, avec des utilitaires comme celui-ci, par exemple, ou implib si tu as Borland.

  9. #9
    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 10_GOTO_10 Voir le message
    Pas forcément. Tu peux aussi aussi recréer le .lib à partir de la DLL, avec des utilitaires comme celui-ci, par exemple, ou implib si tu as Borland.
    Mais dans ce cas, tu ajoutes une liaison vers la DLL "en dur" au lieu d'un chargement JIT, ce qui est plutôt dommage pour UNE fonction...
    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

  10. #10
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Mais dans ce cas, tu ajoutes une liaison vers la DLL "en dur" au lieu d'un chargement JIT, ce qui est plutôt dommage pour UNE fonction...
    Je n'ai jamais dit que c'était la meilleure solution (encore que, je ne suis pas sûr que tout le monde utilise un appel dynamique pour une seule fonction). Ce que je voulais dire, c'est que ce n'est pas l'unique solution, comme la tournure de ta phrase pouvait le laisser penser.

    Et d'après ce que j'ai compris, ce code n'est qu'un test. Le programme définitif devant utiliser plus d'une fonction:

    Ensuite, je pense pouvoir en tirer la méthode pour mon travail, ...

  11. #11
    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 10_GOTO_10 Voir le message
    Ce que je voulais dire, c'est que ce n'est pas l'unique solution, comme la tournure de ta phrase pouvait le laisser penser.
    Dans ce cas, OK. Après, j'ai tendance à apprécier moyennement les imports "en dur" lorsque l'on peut faire autrement (ce qui n'est pas le cas d'un import de classe C++, effectivement).
    Mais sur une interface de type stdcall (ce que fait Delphi), sur une DLL non-système, je trouve dommage de se priver du JIT et de possibilités intéressantes comme le remplacement à chaud des DLL pendant le fonctionnement du programme... Surtout pour une DLL de calcul !
    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

Discussions similaires

  1. [VB6]appel de dll en C avec paramètres
    Par SerLab dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/02/2006, 14h49
  2. Appel de dll
    Par david71 dans le forum WinDev
    Réponses: 3
    Dernier message: 08/12/2005, 14h58
  3. DLL classique - appel de DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 8
    Dernier message: 12/07/2004, 14h34
  4. Appels fonctions DLL
    Par Micka91 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 17/02/2004, 17h32
  5. [VB6] [Langage] VB6 et les appels de dll
    Par Dave63 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 16/01/2003, 18h20

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