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 :

Initialisation d'une DLL non mfc


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Initialisation d'une DLL non mfc
    Bonjour, j'essaie de charger une librairie non mfc dans un projet.
    J'ai pu trouver cet exemple de code sur la msdn mais je ne comprends pas les paramètres utilisés dans la fonction DllMain.

    Quelqu'un pourrait me dire qu'est-ce que c'est et à quoi ils servent s'il vous plait?

    Voici le code:

    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
    BOOL APIENTRY DllMain(HANDLE hModule, 
                          DWORD  ul_reason_for_call, 
                          LPVOID lpReserved)
    {
        switch( ul_reason_for_call ) {
        case DLL_PROCESS_ATTACH:
        ...
        case DLL_THREAD_ATTACH:
        ...
        case DLL_THREAD_DETACH:
        ...
        case DLL_PROCESS_DETACH:
        ...
        }
        return TRUE;
    }
    Je vous remercie.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    1-il faut trouver un bon tuto sur la programmation win32
    2-MFC masque tout cela; dans une dll MFC tu as le même code mais il est masqué en quelque sorte.
    DllMain c'est le point d'entrée de la dll de manière similaire à int main() pour un programme en ligne de console C.
    Pour un exe win32 c'est WinMain().
    Je suis sur qu'il ya un tuto sur les dll

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Voilà, après avoir visité les forums sur le chargement de librairie non mfc voilà ce que j'ai fais pour charger ma librairie:

    Je suis ici dans le dllmain.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BOOL Dllmain::InitInstance()
    {
    	// TODO:  perform and per-thread initialization here
     
       typedef int(*Type_Pointeur_De_Fonction)(const int, char*const,double*);
       Type_Pointeur_De_Fonction Pointeur_Fonction;
       DLLHandle = LoadLibrary("C:\\Barthe\\test_MFC_bis\\C843_GCS_DLL.dll");
       Pointeur_Fonction = (Type_Pointeur_De_Fonction)GetProcAddress(DLLHandle,"C843_qPOS");
       return 0;
    }
    Et ce que j'ai fais pour la libérer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int Dllmain::ExitInstance()
    {
    FreeLibrary(DLLHandle);
    }
    Donc ici, pas d'erreur lors de la compilation, ce qui signifie donc que ma dll a bien été chargée (enfin je crois...)

    Par contre dans un autre fichier .cpp, je rajoute le .h du code ci-dessus et j'essaie d'utiliser la fonction que j'ai déclaré plus tôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "dllmain.h"
     
    void CTest_MFCView::OnUpz() 
    {
    	UpdateData(TRUE);
            C843_qPOS(ID,"3",&Pos_az);	
     
     
    }
    mais j'ai une erreur du type:
    test_MFCView.obj : error LNK2001: unresolved external symbol __imp__C843_qPOS@12
    Debug/test_MFC.exe : fatal error LNK1120: 1 unresolved externals

    Avez-vous une idée s'il vous plait?

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par miwarrior Voir le message
    Donc ici, pas d'erreur lors de la compilation, ce qui signifie donc que ma dll a bien été chargée (enfin je crois...)
    1-re : apprendre à déboguer et utiliser des breakpoints
    2-euh j'arrive pas à comprendre: tu veux charger une dll au sein d'une dll ?

  5. #5
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    test_MFCView.obj : error LNK2001: unresolved external symbol __imp__C843_qPOS@12
    Debug/test_MFC.exe : fatal error LNK1120: 1 unresolved externals
    normal que le linker ne trouve pas la fonction puisque tu charges la dll au moment de l'exécution et non de la compilation.

    deux solutions pour se lier à une DLL:

    * soit à la compilation : il faut alors indiquer au LINKER un fichier .LIB qui décrit le contenu de la DLL. Ce fichier .LIB est généré lorsque tu compiles la DLL. Si c'est pas toi qui a créé la DLL, tu dois récupérer le fichier .LIB auprès de la personne qui l'a compilée. Pour déclarer au LINKER ce fichier .LIB, ça se passe dans les Propriétés du projet, rubrique Linker / Input

    tu dois aussi avoir un fichier header .h qui déclare tout les prototypes de fonctions avec _declspec(dllimport) pour que ça marche


    * soit à l'exécution : dans ce cas tu utilises LoadLibrary / FreeLibrary
    Le LINKER lui ne sait pas quoi faire avec ta fonction C843_qPOS qu'il ne connait pas ...

    par contre, ton appel à ta fonction, tu peux le faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Pointeur_Fonction = (Type_Pointeur_De_Fonction)GetProcAddress(DLLHandle,"C843_qPOS");
     
    ...
     
    Pointeur_Fonction(ID,"3",&Pos_az)
    @+

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/05/2007, 21h40
  2. Réponses: 3
    Dernier message: 19/02/2007, 15h07
  3. Dll managé utilise une dll non managé
    Par DAMVAL dans le forum C++/CLI
    Réponses: 3
    Dernier message: 28/11/2006, 10h36
  4. Réponses: 12
    Dernier message: 30/01/2006, 21h13
  5. Creation d'un message dans une dll non MFC
    Par dug dans le forum Windows
    Réponses: 1
    Dernier message: 29/11/2005, 12h50

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