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 :

problème execution dll


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 45
    Points
    45
    Par défaut problème execution dll
    bonjour j'ai créé une dll très simple sous visual c++ 6.0.
    Mais je n'arrive pas a l'utiliser avec un autre programme visual.
    Pourtant j'ai bien créé le .def .lib .dll.

    Lorsque j'essaie d'utiliser la fonction Sendmessage() , ce message d'erreur 'affiche:

    simulation interfaceDlg.obj : error LNK2001: unresolved external symbol __imp__Sendmessage

    Pourtant j'ai bien verifier Sendmessage n'est pas confondu avec l'API SendMessage.

    J'ai lu que la declaration doit etre faite comme ceci :

    extern "C" int _ _declspec(dllimport)Sendmessage(int message);

    mais moi je n'y arrive pas donc je l'es declaré comme ceci :

    extern "C" int _declspec(dllimport)Sendmessage(int message);

    Est ce que tu pourrais m'aider et m'envoyer peut etre des liens qui explique etape par etape comment creer et utiliser des dll sous windows.

    merci beaucoup.

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    quel autre type prg du vc,vb du delphi du c++ bulder ?

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Et par rapport à la convention d'appel ?
    __stdcall ?
    __cdecl ?
    __fastcall ?

    si je ne me trompe, faut utiliser la meme que celle utilisée pour le link de la dll

  4. #4
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    deja tu a utilise extern "C" donc tes fonctions sont consideres comme des fonctions à signature au format du C et pas du C++
    si ton autre prog c'est du vc il faut include le header de declaration ou il y extern "C" pour utiliser les fonctions non "decorees" en C++.
    à titre d'infos dans mes reponses j'ai donné un exemple de declaration
    avec extern "C" et #ifdef CPLUSPLUS .

  5. #5
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    allez je complete mon poste :
    cote dll dans un contexte vc à vc (ouhlala)
    tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // header interface
    #ifdef __cplusplus 
    extern "C"
    {
    #endif
    __declspec(dllexport) void prnch(int c);
    #ifdef __cplusplus 
    }
    #endif
    cote prog utilise le meme header ca fonctionnera meme dans un contexte C++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    Salut ,
    j'ai beau tout essayer , il n'y a rien qui marche , j'ai essayé les liens explicites et implicites , en lien implicite j'ai erreur :

    test chiffrage 2.obj : error LNK2001: unresolved external symbol __imp__chiffrer
    Debug/Test chiffrage 2.exe : fatal error LNK1120: 1 unresolved externals

    en explicite , j'ecris :

    hinstance=::LoadLibrary("chiffrage.dll");

    // récupérer un pointeur vers la fonction
    pfonction=(t_chiffrer*)::GetProcAddress(hinstance,"chiffrer");

    // appeler la fonction avec les paramètres 'A' et cle
    (*pfonction)('A',cle);

    La c'a compile mais par contre le pointeur pfonction pointe sur rien donc erreur.

    Je pense que ca vien peut etre de mon compilateur , est ce que tu aurais un petit programme de test avec des dll.
    merci

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Ca vient peut-etre de ta librairie, qui n'est pas bien concue.

    Essaie avec une autre librairie : (ex : kernel32)
    as-tu bien pensé au prototypage ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef BOOL (WINAPI *Fn_ProcessIdToSessionId)(DWORD, DWORD *);
    extern Fn_ProcessIdToSessionId pProcessIdToSessionId;
     
     
    Fn_ProcessIdToSessionId pProcessIdToSessionId = NULL;
     
    instance_kernel32 = LoadLibrary("kernel32.dll");
    if (instance_kernel32)
    {       
          pProcessIdToSessionId = (Fn_ProcessIdToSessionId) GetProcAddress (instance_kernel32, "ProcessIdToSessionId");
    }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    J'ai essayé avec kernel , c'a ne fonctionne pas , donc par la suite j'ai créé une dll d'extension MFC , c'est a dire que j'ai encapsuler une classe dans la dll en rajoutant AFX_EXT_CLASS devant et là pas de problème tout a bien fonctionné .

    Je vous remercie vivement pour toutes vos réponses.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut
    Voic un exemple qui marche:

    Dans le code de la DLL, la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C" BOOL __declspec(dllexport) __cdecl popmsg(int param)
    Dans le code du projet appellant la DLL

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

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    Salut ,
    je te remercie pour ton exemple mais j'ai beau essayer , ja ne fonctionne pas , est ce qu'il faudrait pas rajouter le fichier .h de la dll?
    merci

  11. #11
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    certainement.
    c'est ce que je fais avec mes dll ,voir mon post precedent .

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    Je suis trop bête , c'était ca .
    Je te remercie pour ton aide , c'est sympa
    salut

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut
    Désolé, mais pour ma part je n'ajoute pas le fichier .h de la DLL et tous fonctionnes......?

  14. #14
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    et tu fais quoi ?loadlibrary pour acceder à tes fonctions ?
    dans tous les cas tu a besoin d'un header pour declarer tes fonctions .

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 92
    Points : 55
    Points
    55
    Par défaut
    Faux !!

    Pour déclarer la fonction je fait comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef BOOL ( __cdecl *DLLPOPMSG)(int param);
    Je suis d'accord qu'il faut connaitre les paramètres à envoyer

  16. #16
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour une fonction de ce style d'accord ,mais mon propos etait de dire quand tu a comme moi un dll avec une centaine de fonction il est a mon avis judicieux d'utiliser le meme header surtout pour le prototypage des fonctions .
    pour la maintenance logiciel c'est mieux ça evite les erreurs;du moins c'est mon avis.

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

Discussions similaires

  1. Problème execution d'une DLL en ASP
    Par turcotm dans le forum ASP
    Réponses: 3
    Dernier message: 03/09/2005, 09h16
  2. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43
  3. Problème de dll à l'execution
    Par gege2061 dans le forum Windows
    Réponses: 3
    Dernier message: 11/03/2005, 11h22
  4. Problème executable et windows
    Par mulot49 dans le forum MFC
    Réponses: 9
    Dernier message: 17/06/2004, 09h34
  5. Problème de DLL.
    Par Lunedor dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2003, 10h17

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