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

Delphi Discussion :

DLL c++ impossible de trouver la fonction


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut DLL c++ impossible de trouver la fonction
    bonjour à tous,

    Me voici avec un problème que je n'arrive pas a solutionner même en farfouillant dans le forum :

    Je cherche à executer une fonction dans une DLL C++ a partir de Delphi.

    j'ai d'abord crée une DLL en Delphi et je l'ai appelé de puis mon prog, pour le debug, et ça marche nickel.

    ensuite je mets la DLL que l'on me livre et la, impossible de me connecter au fonctions de la DLL, la DLL se charge bien mais l'assignation des fonction par GetProcAdress ne marche pas.

    a force de chercher, j'ai fait un Tdump et voilà le résultat : bizarre.....

    (j'ai mis les trois point pour pas vous embéter avec toutes les fonctions exporter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Display of File toto_h.dll
     
    ...
    EXPORT ord:0004='?conTH@@YAHPAD000PAH00000@Z'
    ...
    EXPORT ord:0007='?resTH@@YAHPAD000PAH00000@Z'
    le nom des fonction que je cherche sont bien resTH et conTH mais la c'est bizarre tous ces caractères avant et aprés non

    dans "dependency Walker " il faut que je clique sur "undecorate C++ fonction"

    pour voir alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int conTH(char *,char *,char *,char *,int *,char *,char *,char *,char *,char *)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int resTH(char *,char *,char *,char *,int *,char *,char *,char *,char *,char *)
    ça ca correspond bien à ce que je veux ..

    j'ai l'impression que mon problème vient de là . qu'en pensez vous ???

    Pour plus d'info voici le code de mon prog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResTHInDLL: function(ID, DP, OPR: Pchar; DHr: PChar;out  CodeRetour: PInteger;out Quad: Pchar; Host, User, Pass, Db: Pchar): Integer; cdecl;
    et l'association via GetProcAdress :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          ResTHinDLL := GetProcAddress(hDLLHandle, ResTH);
     
          if not assigned(ResTHinDLL) then
            begin
              mess := 'resTH introuvable dans la DLL';
            end;
    la déclaration de la fonction dans la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __declspec(dllimport) int resTH(char *, char *,char *,char *,int *,char *,char *,char *,char *,char *);

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut et bienvenue sur Developpez.com
    Je ne suis pas un spécialiste des DLL mais je crois que ton erreur vient de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ResTHinDLL := GetProcAddress(hDLLHandle, ResTH);
     
    if not assigned(ResTHinDLL) then
    begin
      mess := 'resTH introuvable dans la DLL';
    end;
    T'as oublié des @ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @ResTHinDLL := GetProcAddress(hDLLHandle, ResTH);
     
    if not assigned(@ResTHinDLL) then
    begin
      mess := 'resTH introuvable dans la DLL';
    end;
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Ok je vais voir mais je ne pense pas que ça vienne de la, car mon code fonctionne trés bien avec ma DLL faites en Delphi, mais pas avec celle qui m'est livrée et qui est developpée en C++.

    En tous cas merci.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 927
    Billets dans le blog
    6
    Par défaut
    et si tu essayes de la récupérer par index au lieu de la récupérer par nom ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Citation Envoyé par tourlourou
    et si tu essayes de la récupérer par index au lieu de la récupérer par nom ?
    Pareil en faisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @ResTHinDLL := GetProcAddress(hDLLHandle,'7');
    ça marche pas....

    je comprends pas on dirait que ça vient de la declaration qui est pas la même.... pourtant il me semble que la liaison C++ Delphi sur les c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char * (C++)  --> Pchar (Delphi)
    int * (C++) --> Pinteger (Delphi)
    en tous cas c'est ce que j'ai fait...

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Visiblement, le problème vient de la déclaration de ta fonction externe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResTHInDLL: function(ID, DP, OPR: Pchar; DHr: PChar;out  CodeRetour: PInteger;out Quad: Pchar; Host, User, Pass, Db: Pchar): Integer; cdecl;
    D'où tiens-tu le nom des variables (ID, DP, OPR, etc.)?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Citation Envoyé par Pedro
    D'où tiens-tu le nom des variables (ID, DP, OPR, etc.)?
    ça c'est des noms a moi..... !!!

    pourquoi ça pose problème, ....

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Par contre les types ( et c'est ce qui est important je pense) me viennent du developpeur de la DLL en C++.

    est ce que le problème pourrais venir du mode de passages des paramètres par valeur ou par reference.

    car dans les 10 paramètres de chaque fonctions il y en a 2 qui sont des paramètres de retour d'ou mon dans la definition de la fonction.

    est ce que ça pourrais venir de là ???

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 927
    Billets dans le blog
    6
    Par défaut
    essaye de remplacer out par var
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 26
    Par défaut
    Citation Envoyé par tourlourou
    essaye de remplacer out par var
    déja tenté,

    en fait j'ai de plus en plus l'impression que c'est la DLL qui m'a été livré qui pose problème....

    il faut que je reboucle avec le developpeur de la dite DLL.

    en tous cas merci je vous tiens au courant si je peux....

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    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 489
    Par défaut
    salut

    quelle est la condition d'appel que tu lui as mis ?

    il en existe plusieurs : register, pascal, cdecl, stdcall, et safecall

    en resumé
    stcall c'est pour les api windows
    safecall pour les objet COM
    cdecl pour les dll ecrite en c et c++ (ton cas)
    register etant la convention par defaut et pascal n'etant la que pour une compatibilité acendante

    @+ Phil

    PS : regarde si par hazard la dll en c++ n'as pas été compilé avec une autre condition d'appel

Discussions similaires

  1. Erreur 523: impossible de trouver la dll de la base de donnees
    Par franck SEFIC dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/04/2008, 14h25
  2. DLL en C: Impossible de trouver le point d'entrée
    Par cyrille37 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 27/03/2008, 17h48
  3. Réponses: 9
    Dernier message: 22/10/2007, 09h38
  4. Réponses: 1
    Dernier message: 27/04/2007, 18h25
  5. Trouver une fonctions dans des DLL
    Par Mercenary Developer dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2005, 15h28

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