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

Langage Delphi Discussion :

Problème utilisation DLL C++ dans un programme Delphi


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut Problème utilisation DLL C++ dans un programme Delphi
    Bonjour,

    Je développe sous Delphi 2005, un petit programme qui fait appel à une fonction simple d'addition de deux entier cette fonction est définit dans une DLL codé en C++ dont le code (.h) est le suivant

    Code : 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
     
     
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
     
    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API int  Add(int a, int b); 
    }
    La DLL est généré sous Visual Studion et marche très bien quand l'appel se fait d'un programme C++.

    J'essaye de faire l'appel avec un programme Delphi qui le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    implementation
     
    {$R *.dfm}
    function Add(A, B: integer): integer; stdcall; external 'MathTest.dll' name 'Add';
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      temp : integer;
    begin
     
       temp := Add(2,5) ;
    end;
    A l'exécution j'ai le message d'erreur "Le point d'entrée de procédure Add est introuvable la bibliothèque de lien dynamique MathTest.dll"

    Est ce qu'il y aurait quelqu'un qui pourrait m'aider à identifier mon erreur

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    c'est normal, la fonction n'est pas exportée sous le nom "Add", n'importe quel outils d'analyse de DLL le montrera, comme DID32 par exemple
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Merci, mais j'ai essayé sans définir le nom "Add"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     function Add(A, B: integer): integer; stdcall; external 'MathTest.dll'
    et le message d'erreur est le même

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Regardes déjà avec un programme comme Dependency Walker sous quel nom est exportée ta fonction. Fait attention à la "décoration", tu peux regarder au niveau de la déclaration "extern c".

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    C'est surtout que c'est une méthode d'une classe, comme elle static, peut-être qu'elle est visible de l'extérieur
    Peu de langage soit capable d'importer une classe C++, seulement des fonctions isolées pour Delphi en tout cas

    le nom risque d'être un truc tordue genre _ZN9MathFuncs11MyMathFuncs3Add$8 voir Mangled Names

    Utilise ...\Embarcadero\RAD Studio\x.0\bin\TDUMP.exe pour trouver le nom réel
    Si tu n'es pas fan de la ligne de commande, DependecyWalker comme le propose phoenixgreg fonctionne très bien
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Ou une fois le programme lancé en mode debug, menu Voir -> Fenêtres de debugage -> Modules (ou Ctrl+Alt+M) et cliquer sur la dll.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    J'ai utilisé Dependency Walker le nom de la fonction add qu'il me retourne est "?Add@MyMathFuncs@MathFuncs@@SGHHH@Z". J'ai modifié mon code d'appel Delphi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     function Add(A, B: integer): integer; stdcall; external 'MathTest.dll' name '?Add@MyMathFuncs@MathFuncs@@SGHHH@Z';
    mais le message d’erreur est toujours le même

    Merci

  8. #8
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Essaye d'englober les méthodes que tu veux exporter avec la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    extern "C"{
    ...
    }
    Cela permet d'éviter la décoration.

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Ton appel de convention stdcall, je te conseil cdecl à la place pour les raisons suivantes :
    https://msdn.microsoft.com/en-us/library/zkwh89ks.aspx

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    est tu sur que ce soit du stdcall ?
    j'ai lu quelque par que par defaut les compilo c font du cdecl;
    sinon plutot qu'un appel direct essaye avec le loadlibrary
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Citation Envoyé par nassim1987 Voir le message
    il me retourne est "?Add@MyMathFuncs@MathFuncs@@SGHHH@Z".
    le ? au début me rappelle des mauvais souvenirs !
    Même la création d'un fichier DEF d'import n'a pas été possible

    Sous C++Builder, au final, j'avais utilisé une version de la DLL compilé SANS décoration depuis VSC++ (j'ai eu de la chance d'en trouver une ! )
    Je pense qu'en Delphi, cela ne sera pas mieux pour le lien statique

    Utilise plutôt LoadLibrary/GetProcAddress, au lieu d'un lien statique, je crois que cela a plus de chance de fonctionner

    Pour le stdcall / cdecl, phoenixgreg et anapurna ont probablement raison
    J'ai souvent eu affaire à du __stdcall mais il était TOUJOURS explicite, comme il ne l'est pas dans ton code C++, c'est surement du cdecl
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    Points : 67
    Points
    67
    Par défaut
    Merci, ça fonctionne avec l'utilisation des fonction LoadLibrary et GetProcAdress

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

Discussions similaires

  1. Problème utilisation Dll créée en delphi dans une appli VB6
    Par Djelangelo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/01/2011, 15h48
  2. Réponses: 4
    Dernier message: 22/09/2008, 09h11
  3. utiliser une DLL C++ dans un Exe Delphi
    Par rudi0 dans le forum Delphi
    Réponses: 1
    Dernier message: 13/12/2006, 22h49
  4. utiliser dll c++ dans delphi
    Par delphino2006 dans le forum Delphi
    Réponses: 4
    Dernier message: 07/11/2006, 20h19
  5. Dll en c++ dans un programme delphi
    Par wikers dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2005, 15h39

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