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

probleme link dll


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut probleme link dll
    Bonjour,

    j'essaie de linker une dll écrite en fortran avec un exe en C++.
    Ma dll s'appelle DDL.dll et contient une routine qui s'appelle Flash.

    Cette routine prends en entrée 5 paramètres :
    -N1 = entier codé sous 2 octets
    -N2 = vecteur d entiers de taille 30 codés sous 2 octets
    -N3 = vecteur de réels de taille 30
    -N4 = un reel
    -N5 = un reel

    Et elle retourne 5 paramètres :
    -M1 = vecteur de réels de taille 30
    -M2 = vecteur de réels de taille 30
    -M4 = un réel
    -M5 = un entier codé sur 2 octets

    Dans les options de mon projet, j'ai bien ajouter dans l editeur de lien DDL.dll
    Mon code C++ est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    double* __declspec (dllimport) Flash(unsigned short int N1,short int* N2, double* N3, double N4, double N5);
     
    int main() {
        unsigned short int N1 = 9;
        short int N2[30];
        double N3[30];
        double N4 = 0;
        double N5 = 0;
        double* egal;
        egal = Flash(N1, N2, N3, N4, N5);
        return 0;
    }
    Quand je compile, j'ai ce message :
    undefined reference to `_imp__Flash'

    J'avoue ne pas comprendre, puisqu'il me semble avoir "tout bien fait".

    Si quelqu'un pouvait m'aider ce ne serait pas de refus.


    De plus, j'avoue ne pas trop voir comment récupérer les résultats de ma routine : elle renvoie 4 paramètres. Est-ce que je stocke tout dans un tableau que je "sépare" apres, ou est-ce que je peux récupérer les diférents paramètres directement (en déclarant une structure ou quelque chose dans le genre), je ne sais pas du tout comment ca se passe à ce niveau la avec le fortran.

    Je suis sous winXP et j use DevC++.

    ps : je ne suis pas sur non plus que les types que j'ai mis (unsigned int etc) soit les bons, si on pouvait me confirmer ...
    ps2 : je n'ai ni le .a ou .lib de la dll, ni le code source (mais la casse et la syntaxe sont bonnes)

    Merci d'avance.
    Kokocha

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    est ce que avec Devcpp il y a un .lib quand tu compiles la DLL ?
    si oui ajoute le aux dépendances de ton projet principale

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    ben ma dll est déja compilée et je n'ai pas le .lib ni le source...

    Mais si malgré cela il y a une méthode pour générer un .lib, je suis preneur

    Je ne sais même pas si cette erreur est du au link qui ne se fait pas ou à l'appel de la routine fortran...

    Parce que si c'est la routine fortran, est-ce que ca serait possible que ce soit les types qui ne lui conviennent pas (genre c'est pas les bons types donc il ne connait pas cette méthode)

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    visiblement c'est des ".a" qu'il faut que tu rajoutes au projet

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    Je pense avoir piger ou été le problème :

    dans le code dont je me suis inspiré pour faire le mien, le mec quand il crée sa dll, il déclare ses méthodes avec des (dllexport), ce que moi je n'ai pas fait bien sur (puisque ma dll est deja compilée)

    Je pense que le problème vient de la, si quelqu'un pouvait confirmer...

    Pour le reste, je crains devoir poster dans le forum lié au fortran à ce moment la ...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Si tu n'as pas de .lib, tu peux essayer de linker manuellement à l'exécution avec LoadLibrary(), GetProcAddress() et FreeLibrary().

    --> Un exemple ici.

  7. #7
    Invité de passage
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Par défaut Probleme link DLL
    Ta DLL a ete crée avec VC, ou MinGW?
    Sinon tu peux vite savoir si il a mis DLLEXPORT en utilisant la méthode rigobert, si ca marche... C'est qu'il l'a fai, par contre je pige pas trop comment visual fai ses DLLs et comment les utiliser avec MinGW. Pk ils utilisent pas ELF comme tout le monde chez microsoft qu'on soit pénard, lol?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    ma DLL a été créée avec Compaq Visual Fortran 6.6.a.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    As-tu essayé de linker dynamiquement comme expliqué précédemment ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    oops je pensais avoir répondu désolé rigobert ^^
    En tout cas merci parce qu'il y a l'air d'y avoir du mieux (du moins je pense lol).

    J'arrive à compiler, mais quand il execute le programme, il y a une erreur et il se kill.

    Now je pense que ca vient peut-être des paramètres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hinstLib = LoadLibrary(TEXT("myputs")); // Ici je met le nom de ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("myPuts")); // Ici le nom de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (ProcAdd) (TEXT("Message via DLL function\n")); // et ici le nom de ma fonction et ses arguments
    C'est bien cela qu'il faut faire non ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. Je peux voir comment sont déclarées myputs et MYPROC ?
    2. Tu vérifies les valeurs de retour ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    yes sur

    Ia un link dans le projet vers le rep ou se trouve la dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hinstLib = LoadLibrary(TEXT("DDL_Excel.dll"));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("Flash"));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (ProcAdd) (TEXT("Flash(&N1,N2,N3,&N4,&N5"));
    Et pour les valeurs de retour, si tu parle de celle de retour de la fonction, je ne peut pas les tester puisque le programme se kill apres être lancé.

    ps : j'ai réussi a charger cette dll via VBA/excel, si ca peut aider, je peut mettre le code ...

    Merci
    Kokocha

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. T'as pas répondu à mes questions, je t'ai demandé les déclarations de fonction et le typedef de MYPROC.
    2. Non, je parle des valeurs de retour des fonctions système (LoadLibrary() et GetProcAddress(), sans oublier le retour de GetLastError() si le handle ou l'adresse retournée est une valeur d'erreur)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 20
    Par défaut
    yop c'est bon c'est résolu.
    Merci à tout le monde et surtout rigobert (pour le link sur le loadLibrary) et Medinoc (pour le typedef de MYPROC).

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h> 
    #include <windows.h> 
    #include <stdlib.h>
     
    typedef int (*MYPROC)(short int* ,short int* , double* , double* , double*);
     
     
    int main() {
        short int* N1 = malloc(1*sizeof(short int));
        short int* N2 = malloc(30*sizeof(short int));
        double* N3 = malloc(30*sizeof(double));
        double* N4 = malloc(1*sizeof(double));
        double* N5 = malloc(1*sizeof(double));
     
    //def les constantes
     
        HINSTANCE hinstLib; 
        MYPROC ProcAdd; 
        BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
        // Get a handle to the DLL module.
     
        hinstLib = LoadLibrary(TEXT("DDL_Excel.dll")); 
     
        // If the handle is valid, try to get the function address.
     
        if (hinstLib != NULL) 
        { 
         //   printf("OK lib\n");
            ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("Flash")); 
     
            // If the function address is valid, call the function.
     
            if (NULL != ProcAdd) 
            {
     //           printf("OK procAdd\n");
                fRunTimeLinkSuccess = TRUE;
                ProcAdd(N1,N2,N3,N4,N5); 
            }
     
            // Free the DLL module.
            fFreeResult = FreeLibrary(hinstLib); 
        } 
     
        // If unable to call the DLL function, use an alternative.
     
        if (! fRunTimeLinkSuccess) 
            printf("Message via alternative method\n"); 
        return 0;
    }
    Il y avait bien une erreur dans le typedef MYPROC ainsi que dans le passage des paramètres à la dll.

    Merci @ tous
    Kokocha

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

Discussions similaires

  1. Probleme sur DLL & VCL
    Par Romain² dans le forum Langage
    Réponses: 4
    Dernier message: 03/04/2006, 18h10
  2. Probleme: recompilation DLL en VB6 impossible
    Par balibo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 04/11/2005, 10h16
  3. Link DLL
    Par lenouvo dans le forum MFC
    Réponses: 7
    Dernier message: 08/08/2005, 16h27
  4. [CR] Probleme avec Dll P2oledb.dll
    Par malban dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/08/2004, 09h10
  5. Probleme "linking nonincrementally"
    Par MissParker dans le forum C
    Réponses: 3
    Dernier message: 08/01/2003, 09h52

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