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 :

Pb de DLL


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Par défaut Pb de DLL
    Salut à tous!!

    je sais comme certain le diront, une fois qu'ils auront lu mon post, "question deja posée".
    mais je me permet d'insister car apres avoir recherché sur le forum:

    http://www.developpez.net/forums/viewtopic.php?t=141762
    http://www.developpez.net/forums/vie...&highlight=dll
    http://www.developpez.net/forums/vie...&highlight=dll
    http://www.developpez.net/forums/vie...&highlight=dll
    http://www.developpez.net/forums/vie...&highlight=dll

    et encore plus...

    je n'arrive tjrs pas à exploiter une fonction dans une Dll.

    voici comment je charge ma Dll et j'appel ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       HINSTANCE m_hDLL; 
       void (*m_Test)(DWORD,HWND);
       m_hDLL = ::LoadLibrary((LPCTSTR) "c:\\MaDll.dll"); 
       m_Test = (void (*)(DWORD,HWND)) ::GetProcAddress m_hDLL, "BoiteDlg");
    et voici comment est declaré ma fonction dans ma Dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    extern "C" __declspec(dllexport)BoiteDlg()
    {
       AfxMessageBox("Ca Marche");
    }
    donc normalement ca devrai m'afficher une Dlg avec ce message.
    et bah non rien ne se passe, pas d'erreur donc je suppose que ma Dll est bien chargée (meme en debug il me crée bien une instance).

    je dois surement faire une erreur ds l'appel de ma fonction mais là je seche

    si kelkun avais une petite idée....

    je vous remerci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut moi j'ai une petite idee ..
    et jurer cracher j'ai deja repondu au meme probleme plusieurs fois.
    si tu fais ca doit fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //dans la dll: header de declaration
    #ifdef __cplusplus 
    extern "C"
    {
    #endif
    __declspec(dllexport) void prnch(int c);
     
    // etc .........
    #ifdef __cplusplus 
    }
    #endif
    cote applicatif si tu utilise le même header ca doit fonctionner.
    maintenant si tu tiens absolument à faire loadlibrary
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef int (__cdecl *PFI)(...);
    typedef void * (__cdecl *PFPVOID)(...);
    typedef char * (__cdecl *PFPCHAR)(...);
    typedef void (__cdecl *PFVOID)(...);
     
    PFPVOID m_test;
    m_test=(PFVOID)GetProcAddress(m_hDLL, "BoiteDlg");
    en plus dans ton code le retour ta fonction est de type void implicite (vaut mieux le mettre ).
    ton proto de fonction prend des arguments DWORD,HWND alors que ta fonction de dll non . pb .

  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Farscape,
    L'utilisation de Loadlibrairy n'a rien a voir avec le extern C.

    L'erreur vient du fait que tu charges la fonction par GetProcAddress avec la mauvaise signature
    Tu devrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       HINSTANCE m_hDLL;
       void (*ptr_Test)();
       m_hDLL = ::LoadLibrary((LPCTSTR) "c:\\MaDll.dll");
       ptr_Test test = ::GetProcAddress (m_hDLL, "BoiteDlg"); 
       test(); // appel de ta fonction dans la DLL;
    PS : Par contre dans ta DLL, je vois que tu utilises AfxMessageBox. Cela ne marchera bien evidemment que si tu as spécifié dans le projet de ta DLL d'utiliser MFC. Sinon tu peux toujours utiliser MessageBox tout simplement juste pour tester

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Par défaut
    Merci a vous deux,

    mais aucune des deux ne fonctionne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //dans la dll: header de declaration 
    #ifdef __cplusplus 
    extern "C" 
    { 
    #endif 
    __declspec(dllexport) void prnch(int c); 
     
    // etc ......... 
    #ifdef __cplusplus 
    } 
    #endif
    ca compile bien mais rien ne se passe

    et pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HINSTANCE m_hDLL; 
       void (*ptr_Test)(); 
       m_hDLL = ::LoadLibrary((LPCTSTR) "c:\\MaDll.dll"); 
       ptr_Test test = ::GetProcAddress (m_hDLL, "BoiteDlg"); 
       test(); // appel de ta fonction dans la DLL;
    me sort 3 erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1-syntax error : missing ';' before identifier 'test'
     
    2-test' : undeclared identifier
     
    3-cannot convert from 'int (__stdcall *)(void)' to 'int'  This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    si tu pouvais m'expliquer le pointeur de fonction "ptr_Test", je ne comprend pas tout (si c'est bien un pointeur de fonction)

    Encore merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Par défaut
    Resalut!!!

    c'est tout bon j'ai trouvé grace à ce poste:

    http://www.developpez.net/forums/vie...ht=loadlibrary


    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
     
    //dans le fichier h du projet décalartion d'une structure en accord avec la fonction de la DLL 
    typedef BOOL ( __cdecl *DLLPOPMSG)(int param); 
     
     
     
     
    // puis l'appel dans le fichier en .cpp 
    HINSTANCE hInstDLL; 
    DLLPOPMSG dll_popmsg; 
     
    //chargement de la DLL 
    hInstDLL = LoadLibrary("popmsgdlg.dll"); 
     
    //test est appel si ok 
    if(hInstDLL) 
    { 
      dll_popmsg = ((DLLPOPMSG) GetProcAddress(hInstDLL, "popmsg")); 
      dll_popmsg(33); 
    } 
     
    //libération de la DLL 
    FreeLibrary(hInstDLL);
    donc je ne declarai pas correctement tout ca.

    Encore merci à vous deux de m'avoir mis sur la piste.


  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Euh .. oui j'avais oublié le typedef sur la définition du pointeur de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HINSTANCE m_hDLL;
       typedef void (*ptr_Test)();
       m_hDLL = ::LoadLibrary((LPCTSTR) "c:\\MaDll.dll");
       ptr_Test test = (prt_Test)::GetProcAddress (m_hDLL, "BoiteDlg");
       test(); // appel de ta fonction dans la DLL;

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Par défaut
    oui oui c'etait juste ca

    encore merci @+

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Au fait pour mettre resolu utilise plutot le bouton en bas à gauche ;-)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Par défaut
    désolé mais c'est ce que j'ai fait.

    enfin je pense

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Tu viens de le faire : Le resolu apparait maintenant en noir et ne fais plus partie du sujet (vu de l'interieur du post)

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

Discussions similaires

  1. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 11h35
  2. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  3. Débug de DLL
    Par Bayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/07/2002, 15h08
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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