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 : 55
    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 457
    Points
    28 457
    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

  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 586
    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 586
    Points : 25 262
    Points
    25 262
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    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 435
    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 435
    Points : 5 848
    Points
    5 848
    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

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    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

  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