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++Builder Discussion :

Edition de lien avec une DLL : erreur à la 64e fonction !


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Edition de lien avec une DLL : erreur à la 64e fonction !
    Bonjour,

    C'est la première fois que je viens sur ce forum. J'ai en effet rencontré un petit problème sous Borland C++ 6.0, au moment de l'édition de lien avec une DLL.

    Mon projet consiste en :
    - un noyau de calcul réalisé au moyen d'une DLL écrite en ADA (GNAT).
    - une IHM simple (affichage du courbes, sélection de fichiers) écrite en Borland C++.

    Dans le projet, la DLL est tout simplement liée en incluant le fichier ".lib", créé grâce à l'outil Borland "implib". Et au moyen d'un fichier déclarant les fonctions grâce à :
    'extern "C" {
    float Get_Power(Line);
    ....

    }'.

    Jusqu'à présent tout allait bien. Les échanges de données se faisaient correctement. Mais en voulant ajouter une nouvelle fonction à l'interface un phénomène étrange est apparu, au moment de l'édition de lien, la DERNIERE FONCTION dans l'odre ALPHABETIQUE n'était plus vu par le lieur de BORLAND (la 64e fonction exactement). Et le message suivant apparaît : "UNRESOLVED EXTERNAL : _Le_Nom_de_la_64e_fonction".

    Ce qui est interressant c'est que :
    1) si je rajoute 2, 3 ou 4 fonctions supplémentaires dans la DLL, le même message d'erreur se produit : "UNRESOLVED EXTERNAL : _Le_Nom_de_la_64e_fonction". Or la 64e fonction dans l'ordre alphabétique n'est plus la même bien sûr puisque je viens d'en ajouter d'autres... Ainsi, si j'en rajoute 1 : c'est la dernière fonction par ordre alphabétique, si j'en rajoute 2 c'est l'avant dernière, etc.

    2) le compilateur GNAT ne semble pas du tout gêné, Implib ne fait pas d'erreur, et le fichier ".lib", regardé sous NotePad contient bien TOUTES les fonctions...(Ainsi que d'ailleurs bien d'autres fonctions qui ne sont pas dans l'interface)

    3) Le phénomène se produit en fait quelque soit le nombre de fonctions réellement attendues par le code en C. Je veux dire que si par exemple je déclare moins de fonctions dans la partie 'extern "C" ', c'est quand même toujours la 64e fonction, par odre alphabétique, exportée à l'interface de la DLL qui fait un problème au moment de l'édition de lien avec Borland.

    Quelqu'un saurait-il m'éclairer ?
    D'avance merci pour votre aide

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Je n'ai jamais réalisé une DLL avec autant de fonctions, mais ton analyse semble répondre à la question (64 fonctions max ??).

    Le plus simple dans ton cas si il ne te manque pas grand chose, c'est de faire des fonctions paramétrable par familles d'actions pour être en dessous de 64 ou alors 2 DLL.

    Donne nous des informations sur la suite de tes travaux, cela peut intéresser du monde.

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse.

    J'avoue que 64 fonctions seulement pour une DLL semble être une limite assez faible. En plus cela ressemble à un bug car la limitation est mal gérée : le message d'erreur n'est pas adapté... (il devrait dire quelque choses comme "TOO MANY FUNCTIONS..." et pas "UNRESOLVED EXTERNAL" suivi de la 64e fonction).

    Je me suis résolu effectivement à limiter le nombre de fonctions, pour contourner le problème... mais c'est un peu décevant !

    Cordialement,
    Vincent

  4. #4
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    juste pour info :

    Avec une dll faite sous BCB ce probleme de limite de 64 eme fonction n'intervient pas.
    testé avec 76 fonctions..

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    76 fonctions ??? C'est interressant !
    Comment déclares-tu les fonctions à l'interface ?
    Au moyen d'un extern "C" { ... } ou d'une autre manière ?
    D'avance merci pour ta réponse ...

    Vincent

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    moins de 64 fonctions, mais pour ma part :
    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
    extern "C" __declspec(dllexport) int CardDetect(bool Debug,
                                                               void (*)(char *Data, int Len));
    extern "C" __declspec(dllexport) int CardDriver(bool Debug,
                                                               void (*)(char *Data, int Len));
    extern "C" __declspec(dllexport) int CardRead(char *Dirname, int DirnameLen, char *InfoCard, int InfoCardLen, bool Debug,
                                                                void (*)(char *Data, int Len));
    extern "C" __declspec(dllexport) int CardUpdate(unsigned long *DateReal, bool Debug,
                                                               void (*)(char *Data, int Len));
    extern "C" __declspec(dllexport) int CardApropos(bool Debug,
                                                               void (*)(char *Data, int Len));
     
    extern "C" __declspec(dllexport) int CardDowloadDate(unsigned long *DateReal, bool Debug,
                                                                void (*Display)(char *Data, int Len));
     
    extern "C" __declspec(dllexport) int CardCalcDate(int *Year, int *Day, unsigned long DatReal, bool Debug,
                                                                void (*Display)(char *Data, int Len));

  7. #7
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    +1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllexport) __stdcall int etc...

    le probleme vient peut être de la Dll ADA ou de implib ..

  8. #8
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Suite à vos suggestions, j'ai modifié les déclarations des fonctions importées. Au lieu de :
    'extern "C" {
    float Get_Power(Line);
    ....

    }'.

    J'utilise :
    extern "C" __declspec(dllexport) float Get_Power(Line);

    Ca marche également, mais à la 64e fonction il y toujours le même problème. J'ai également remarqué que ça ne dépend que du nombre de fonctions déclarées dans la DLL et pas au niveau de programme en C.

    Toutefois, l'outil IMPDEF permet de voir que TOUTES les fonctions de la DLL écrite en ADA sont bien exportées (y compris après le 64e ...). Donc l'erreur semble provenir :
    - soit de l'outil IMPLIB (utilisé avec l'option) -a,
    - soit du lieur de Borland...

    Après je ne vois pas !
    Qu'en pensez-vous ??

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    As-tu essayé de faire un chargement dynamique avec LoadModule et GetProcAddress ?

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    toujours pas de réponse à ta question mais en import c'est plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllimport) __stdcall int ...

  11. #11
    Candidat au Club
    Inscrit en
    Décembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    EUREKA !
    Ca y'est j'ai enfin trouvé un contournement satisfaisant :

    J'ai gardé le code comme il est, et j'ai simplement modifié la façon de générer le fichier ".lib" et CA MARCHE ! :

    avant je créais le fichier .lib à partir de la DLL (appelée "eac") :
    * implib -a eac.lib eac.dll

    maintenant je crée d'abord un fichier ".def" et ensuite un ".lib" :
    * impdef -a eac.def eac.dll
    * implib -a eac.lib eac.def

    et en procédant comme cela, il n'y a plus d'erreur à la 64e fonction.
    Je trouve que ça ressemble à un bug de implib !!

    Merci pour votre aide.

    Vincent

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Bravo; ça c'est de la persévérence; tu pourrais préciser les deux versions de ces outils(impdef et implib)

    merci

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

Discussions similaires

  1. Erreur de liens avec une base SQL Server
    Par nbaxavf1 dans le forum Bases de données
    Réponses: 0
    Dernier message: 07/06/2011, 15h12
  2. Lien avec une DLL
    Par jadorelescss38 dans le forum ASP
    Réponses: 3
    Dernier message: 09/04/2007, 18h21
  3. Lien avec une DLL
    Par youbyoub dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/08/2006, 17h20
  4. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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