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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    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 confirmé
    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
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 108
    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 950
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 950
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 157
    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

+ 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