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 :

creer et utiliser des DLL


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut creer et utiliser des DLL
    Bonjour,

    j'aimerai creer une DLL sous visual C++, puis l'utiliser dans un programme ecrit avec visual C++.
    Pouvez vous m'aider?
    Merci,

    Gael.

  2. #2
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    tu crées un projet pour faire des dlls sous vs c++ et tu fais générer la lib qui va avec et après il te suffis d'avoir l include des fonction, la lib et la dll pour t en servir dans un autre programme.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    tu as besoin d'un .h d'un .lib et d'un .dll pour utiliser ta libriaire ensuite?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le .h pour le nom des fonctions lors de la compilationd e ton projet, le .lib pour l'édition des liens et le .dll pour l'exécution.
    Sinon, pour créer des dll, il y a une option dans les propriétés du projet.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    J'ai crée un projet de type Win32 Dynamic Link library sous Visual C++ 6.
    J'ai crée dans ce projet un .cpp avec dedans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <stdio.h>
    void function(void) {
       printf("ma premiere dll.\n");
    }
    J'ai crée dans ce projet un .h avec dedans :

    J'ai compilé. Il ne m'a donné qu'un .dll, pas de .lib.
    Ensuite je fais comment pour utiliser cette librarie dans un projet de type win32 console application? Qu'est ce que je ne fais pas correctement?

  6. #6
    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
    salut, pour avoir un .lib, il faut creer un .def avec les fonctions exportées

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LIBRARY	maLibrairie
    EXPORTS
      function  @1
      function2     @2
    et il faut exporter les fonctions dans .cpp et .h

    tu dois rajouter dans le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" type __stdcall

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut


    Tu n'as pas de .lib parce que tu n'exportes aucun symbole. Il faut exporter explicitement les fonctions / ... que tu veux utilisables via ta dll.
    Le fichier .def est une solution.
    L'autre solution, par le code, c'est d'utiliser __declspec( dllexport ) pour l'export, puis __declspec( dllimport ) pour l'utilisation. Pour faire le switch automatiquement entre les 2, on a recours à des macros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef COMPILE_DLL
    #define MADLL_EXPORT __declspec( dllexport )
    #else
    #define MADLL_EXPORT __declspec( dllimport )
    #endif
     
    MADLL_EXPORT void function(void);
    faut définir COMPILE_DLL lors de la compilation de la DLL (options du projet), et puis ça se fait tout seul.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Et dans les options du projet, on peut normalement aussi dire qu'on veut tout exporter dans un .lib.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Merci!

    Avec vos explications, j'ai enfin mon .lib!

    Maintenant, comment je fais pour utiliser ma fonction
    void function(void) dans un autre projet de type win32 console application?


    int main(void) {

    function();

    return 0;

    }

    Comment sait il ou aller chercher la lib?

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Comment sait il ou aller chercher la lib?
    Comme pour toute bibliothèque, c'est toi qui va indiquer dans les options du projet qu'il faut lier avec ton .lib.

    -> En ajoutant son chemin dans "options -> éditeur de lien -> général -> répertoires de bibliothèques supplémentaires"
    -> En ajoutant son nom dans "options -> éditeur de lien -> entrée -> dépendances supplémentaires"

    (sous VS 2003)

    Et n'oublie pas d'inclure l'en-tête qui va avec.

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Miles
    Et dans les options du projet, on peut normalement aussi dire qu'on veut tout exporter dans un .lib.
    c'est une lib statique alors, et non une dll.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Points : 76
    Points
    76
    Par défaut
    Je suis actuellement en train de faire une petite DLL qui regroupe pour l'instant des fonction de convertion.
    J'ai fait ce qui était conseillé dans ce poste, mais j'ai d'autre problèmes...
    Deja ma DLL s'appel convertion, j'ai ajouter la librairie qui y est associé a mon projet, le .h, mais le programme m'a demander un autre .h : "stdafx.h".
    donc voila ce que j'utilise dans le programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "stdafx.h"
    #include "convertion.h"
    //j'utilise la DLL convertion (c'est bien comme ca qu'on fait non?)
    using namespace convertion;
    A la compilation, le programme me met ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18): fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
    Voici une fonction extraite de ma 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
     
    template<typename T>
    //j'ai mis __declspec(dllexport) ici car je ne voyais pas comment pour 
    //definir COMPIL_DLL a la generation du projet comme Aurelien.Regat- 
    //Barrel l'explicait. alors j'ai fait comme dans un tutorial que j'ai trouver
    // sur un autre site
    string __declspec(dllexport) ToString(const T & Value)
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    	//Utiliser un flux de sortie pour créer la chaine
    	ostringstream oss;
    	//écriture de la valeur dans le flux
    	oss<<Value;
    	//Renvoi de la string
    	return oss.str();
    }
    Bon je pense bien que j'ai du faire quelquechose qui va pas, mais bon c'est la première fois que je fait une DLL, y'a un début a tout comme on dit!

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18): fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
    Je crois que c'est assez explicite

    //j'ai mis __declspec(dllexport) ici car je ne voyais pas comment pour
    //definir COMPIL_DLL a la generation du projet comme Aurelien.Regat-
    //Barrel l'explicait
    Pour VS 2003 : options du projet -> C / C++ -> Préprocesseur -> Définitions du préprocesseur. A noter que si tu as fait un projet DLL, le compilo t'a déjà mis un symbole du style MONPROJET_EXPORTS, justement dans ce but.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    string __declspec(dllexport) ToString(const T & Value)
    {
        // ...
    }
    Une fonction template ne s'exporte pas, puisque le compilo doit avoir son code sous la main pour l'instancier. Si tu sais quelles instanciations tu vas utiliser tu peux exporter celles-ci, sinon ne met rien : comme un template doit se trouver dans un en-tête tu pourras utiliser celui-ci partout où tu l'inclues, sans avoir à l'exporter.

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Sinon, rien à voir mais conversion s'écrit avec s, pas un t, c'est du HS, mais bon...

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Le stdafx.h, c'est parce que tu as créé un projet avec utilisation des en-tête précompilées.
    http://c.developpez.com/faq/cpp/?pag...#PROBLEMES_pch

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Points : 76
    Points
    76
    Par défaut
    Honte a moi pour la faute d'orthographe!!

    Sinon merci pour vos réponses.
    Je vais bosser dessus.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    voici ce que j'ai ecrit pour faire 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
    24
    25
     
     functions.h :
    #ifdef COMPILE_DLL 
    #define DLL_EXPORT __declspec( dllexport ) 
    #else 
    #define DLL_EXPORT __declspec( dllimport ) 
    #endif 
     
    DLL_EXPORT void function(void); 
     
    function.cpp :
     
    #include <stdio.h>
     
    #ifdef COMPILE_DLL 
    #define DLL_EXPORT __declspec( dllexport ) 
    #else 
    #define DLL_EXPORT __declspec( dllimport ) 
    #endif 
     
    DLL_EXPORT  void function(void){
     
       printf("ma premiere dll.\n");
     
    }
    J'ai compile avec la directive COMPILE_DLL.

    Ensuite, j'ai construit un projet win32 console application, j'ai inclus dans les options du projet le dossier contenant contenant le .dll et le .lib, et le dossier contenant le .h

    Dans mon main(), j'ai ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "functions.h"
    int main (void) {
       function();
       return 0;
    }
    J'ai compilé sans la directive DLL_COMPILE et a l'edition des liens voici le message d'erreur :
    Linking...
    main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl function(void)" (__imp_?function@@YAXXZ)
    Debug/essai.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

  18. #18
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Mieux vaut inclure "functions.h" dans "functions.cpp" que de dupliquer des définitions. Bref.
    Tu as spécifié l'emplacement du .lib (c'est bien), mais apparement tu ne lui as pas dit d'utiliser ce .lib. De même que tu as spécifié le répertoire du .h, puis que tu lui as dit d'utiliser ce .h via #include, il faut lui dire d'utiliser le .lib.
    Citation Envoyé par Loulou24
    -> En ajoutant son nom dans "options -> éditeur de lien -> entrée -> dépendances supplémentaires"
    ou bien via le code (spécifique VC++)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "functions.h" 
    #pragma comment(lib, "functions.lib")

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Points : 20
    Points
    20
    Par défaut
    Merci pour ces infos. Je progresse!

    Compilation et edition des liens reussies. C'est a l'execution que ca ne marche pas maintenant.

    "cette application ne fonctionne pas car la dll est introuvable".

    Que dois je specifier en plus pour qu'il trouve la dll? (ma .dll est dans le meme dossier que le .lib).

    Merci
    Gael.

  20. #20
    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
    il faut qu'elle soit dans le meme repertoire que l'executable

Discussions similaires

  1. Pourquoi inclure des .lib pour utiliser des DLLs système?
    Par NicolasJolet dans le forum Windows
    Réponses: 4
    Dernier message: 08/08/2006, 14h59
  2. Executable utilisant des DLLs et des LIB
    Par beb30 dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/08/2006, 10h51
  3. Créer et utiliser des fichiers excel sous linux
    Par cronos6 dans le forum Zope
    Réponses: 2
    Dernier message: 02/06/2006, 09h14
  4. [VB6] creer et utiliser un Dll dans VB
    Par Mirna dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/05/2006, 15h03
  5. [C#] Comment utiliser des dll win 32 dans un projet .NET
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 31/05/2005, 13h45

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