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

MFC Discussion :

[v6.0] Importer une DLL


Sujet :

MFC

Vue hybride

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut [v6.0] Importer une DLL
    Bonjour,

    je débute sur visual. Je connais assez bien le C++ pour avoir créer des prog sous linux avec un bon éditeur de texte et compilation en ligne de commande.

    Là je débute et je souffre pour un truc tout bête (j'en suis sûr).
    J'ai une petite appli MFC qui doit lancer deux méthodes qui se trouvent dans une dll.

    Je n'arrive pas à trouver la méthode de l'importation d'une dll pour les nazes comme moi, qui m'explique pas à pas comment faire.

    j'ai bien vu qu'il fallait linker le .lib de ma dll, mais j'ai toujours un message qui me dit qu'il ne reconnait pas ma méthode.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Normalement, tu as besoin du .lib et du header.

    Quel est le message exactement ? Est-ce une erreur de compilation ou d'édition de liens?

    La DLL elle-même, en quel langage est-elle programmée ? (oui, cela PEUT avoir une influence)
    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.

  3. #3
    Membre confirmé Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Par défaut dll
    Bonsoir,

    Est ce que tu as inclus le .h de ton dll ?

    Sinon regardes ce lien de la FAQ par Farscape :
    http://c.developpez.com/faq/vc/?page=DLL#MakeDynDll

    PS : C'est grâce à cet aide que j'ai appris a linker un dll sous VC6.

    A bientôt

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Comme toi lors de mes début avec les DLL j'ai été assez perturbé. J'en ai tiré quelques idées. Que toutes personnes me corrige si je dit des énormités.

    J' ai repere au moins 3 façons diferentes d'utiliser les DLL.

    1- Si c'est une DLL proprio, a la compilation tu as le .lib et le .h
    tu inclue le .lib dans le link de ton projet et le .h avec un #include et tu recupere directement tes fonctions et classe.

    2- Si tu n'a pas le .h et que la DLL à exporter les fonctions avec __declspec(dllexport) tu utilise le __declspec(import) pour la recuperer
    et la faq de farscape et ideal

    3- si tu exporte ta fonction avec int __stdcall nomfct (int var); et un .def
    il faut charger dynamiquement la DLL avec


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef int (CALLBACK* NOMFCT)(int);
     
    HINSTANCE hClcltr=LoadLibrary("Mydll.dll");
    NOMFCT	lpfnfct;
    lpfnfct = (NOMFCT)GetProcAddress(hClcltr,"nomdelafonction");
     
    // pour utiliser la fct
     
    mavarderetour = lpfnfct(monint);
     
    FreeLibrary( hClcltr ); /liberer la lib
    cordialement en esperant t'avoir aidé

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    La dll est en c++, j'ai la lib et le header.

    Mon message d'erreur est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Appnt\SCS\AMIN\AMINDlg.cpp(199) : error C2065: 'FindListe' : undeclared identifier
    En gros, je vais vous dire ce que j'ai fait pour essayer de linker ma dll.

    1- J'ai copié les fichier MaDLL.dll, MaDLL.lib et madll.h dans mon dossier AMIN (du nom de mon projet)
    2- J'ai ouvert mon projet sous visualC++, et ensuite : Project->Setting->Link j'ai tapé : MaDLL.libe et validé
    3- Dans mon main, j'ai ajouté #include"madll.h"

    Ensuite j'essaye d'utilser une des méthodes de ma dll, et j'ai le message précédent.
    Il semble que le link fonctionnne puisqu'avant j'avais mis le header à un autre endroit, et j'obtenais l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AMINDlg.obj : error LNK2001: unresolved external symbol "struct HWND__ * __cdecl FindListe(void)" (?FindListe@@YAPAUHWND__@@XZ)
    Or maintenant, je n'ai pas de message d'erreur sur le link mais sur la déclaration de ma méthode.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    est tu sur que le nom de ta fonction lors de la compilation de ta DLL ne t'as pas decoré les noms de tes fonctions?

    si oui va voir ce post

    http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vccore/html/_core_Calling_DLL_Functions_from_Visual_Basic_Applications.asp

    Ce post sur msdn explique la decoration des noms et te permet de resoudre ce pb en creant un .def

    Courage

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    Je suis sûr du nom de ma fonction (j'ai vérifié dans mon header).

    Le lien que tu me donnes c'est pour utiliser une dll avec VB, et moi c'est avec visual C++

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    ne faut 'il pas charger la dll à un moment dans mon code ??

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    normalement non si tu as le . lib et le .h

    J'utilise le chargement de la DLL uniquement qd je n'ai que le .DLL

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Peux tu nous montrer ton .h que tu inclus de la DLL pour voir comment tu exporte tes fonctions .

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Juste unepetite info, tu emploie le mots methodes, c'est une fonction ou la methode d une class que tu exporte et que tu veux utiliser ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    Et si l'on part du fai que je n'ai pas le lib ni le header (puisque j'ai un pb).
    Quelles sont les étapes ?

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    1 - Copier le .DLL dans le repertoire ou sera l'exe

    2 - dans ton code creer un typedef par fonction que tu veux utiliser,
    si par exemple j'ai une fonction du genre int mafonction(int a);

    tu cree en dessous des includes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int (CALLBACK* LPFNMAFONCTION)(int);
    3- charger dynamiquement ta fonction et l'utiliser avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HINSTANCE hClcltr=LoadLibrary("MaDll.dll");
    LPFNMAFONCTION lpfnmafonction; //pointeur sur ma fonction
     lpfnmafonction = (LPFNMAFONCTION)GetProcAddress(hClcltr,"nomdelafonction"); // association du pointeur et de la fonction
    4 - utiliser la fonction

    int a,b;

    5 - liberer la DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FreeLibrary( hClcltr );

    Ca marche pour moi avec des dll exporter avec __stdcall et un .def

    bon courage

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    fonction alors.

    J'ai également le .def pour ma dll.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Peux tu nous donner ton .H pls

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    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
     
    #include <windows.h>
    #include <commctrl.h>
    #include <stdio.h>
    #include "resource.h"
    #define NomFenetreAriane "Ariane Accueil"
     
     
    #define MAX_NB_PROCESS	512
    #define MAX_LONG_STRING	256
    #define t1 10000
     
    bool TesteFille(HWND Fille, char Classe[255]);
    bool ChercheFille(HWND Mere, char Classe[255]);
    BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    int  ChangeURL(char * pch_NewURL,char * pch_OldURL);
    int  Ariane(char pch_Appel);
    HWND FindListe();
    HWND FindNiveau1();
    HWND FindImpala(char * cLibelle, char * cBdd);
    int  ActiveImpala(char * cLibelle, char * cBdd);
    int  Connexion(HWND phwListe, unsigned puMessage, unsigned long wParam, char * lParam);
    int  ActiveListe(HWND phwListe, unsigned puMessage, unsigned long wParam, char * lParam);
    int	 EnvoiTouches(HWND phwNiveau1, int pnFx);
    void CreeBarreOutils(HWND fenetreBT, int height, int decalage, int ajustement);
    void SupprimeBarreOutils(HWND fenetreBT);
    int  BoutonAriane(char * pszIdAppel, char * pszBouton);
    char * CentreCourant(HWND phw_Liste);
    char * CentreCourantN1 (HWND phw_N1);
    char * GetVarEnv(char * variable);
    bool IsPopup(HWND phw_Fenetre);
    bool bKillPrevInstance(char *);
    bool bShowToolTip(char *);
    int Ecr_Log(char [255]);
    int Affichebarre (char * variable);
    int AfficheFenetre (char * variable, char * titre);
    int RechercheIE (char * titre);
    int FindIE (char * variable, char * url);
    HWND hwndFindWindow(HWND hwndParent, char * sClassName);
    int ChargeIE (char * url);
    char * recupIP();
    char * DateDerniereModification(char * fichier);
    char * envoiInfo(char * info);
    int copie_fichier(char * nom);
    int lanceFichier(char * chemin);
    void AvantPlan(char *titre, char * classe);
    pourquoi c'est si compliqué ?

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    tu n' a pas exporter tes fonctions dans ton .h ?

    typiquement dans le .h pour ta fonction HWND FindListe();

    tu dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport) HWND FindListe(void);
    puis recompiler ta DLL

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    si tu as le .def, tu connais les noms exacts des fonctions.

    Si la DLL n'avait pas de .def, il était possible que les fonctions aient des noms décorés que tu ne connaisses pas...
    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.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    Bon, alors on va partir avec le .def, puique je ne peux pas vraiment recompiler la dll.

    Je reprends ce qui fut dit plus tôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef int (CALLBACK* NOMFCT)(int);
     
    HINSTANCE hClcltr=LoadLibrary("Mydll.dll");
    NOMFCT   lpfnfct;
    lpfnfct = (NOMFCT)GetProcAddress(hClcltr,"nomdelafonction");
     
    // pour utiliser la fct
     
    mavarderetour = lpfnfct(monint);
     
    FreeLibrary( hClcltr ); /liberer la lib
    Je reviens juste après avoir essayé.[/code]

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    c'est bon. J'utilise donc le .def, et ça marche.

    Merci pour toit

Discussions similaires

  1. Comment importer une DLL Win 32 en delphi.Net?
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 21/08/2006, 10h33
  2. Comment importer une DLL dans du code???
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 29
    Dernier message: 19/04/2006, 19h19
  3. Importer une DLL
    Par Sallie dans le forum MFC
    Réponses: 8
    Dernier message: 14/04/2006, 10h47
  4. [NetBeans] importer une dll
    Par guitalca dans le forum NetBeans
    Réponses: 1
    Dernier message: 16/12/2005, 11h13
  5. [FLASH MX2004] Importer une dll
    Par Fry dans le forum Flash
    Réponses: 4
    Dernier message: 07/01/2005, 10h54

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