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
    Membre � l'essai
    Inscrit en
    D�cembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5
    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 chevronn�

    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
    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
    Membre � l'essai
    Inscrit en
    D�cembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5
    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 exp�riment�
    Avatar de Djob
    Inscrit en
    Ao�t 2002
    Messages
    215
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 215
    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
    Membre � l'essai
    Inscrit en
    D�cembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5
    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 chevronn�

    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
    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 exp�riment�
    Avatar de Djob
    Inscrit en
    Ao�t 2002
    Messages
    215
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 215
    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
    Membre � l'essai
    Inscrit en
    D�cembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5
    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
    Par d�faut
    As-tu essay� de faire un chargement dynamique avec LoadModule et GetProcAddress ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas �tre meilleur que les autres, il faut �tre meilleur que soi." Albert Jacquard
    "Ceux qui savent o� ils ont pos� leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, �a vous changera les id�es !
    Ma page Prolog
    Mes codes sources comment�s

    Mon avatar : La Madeleine � la veilleuse de Georges de La Tour

  10. #10
    Membre chevronn�

    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
    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
    Membre � l'essai
    Inscrit en
    D�cembre 2005
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 5
    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 chevronn�

    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
    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