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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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 exp�riment� Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    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 averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

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

  15. #15
    Expert confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    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
    Par d�faut
    Honte a moi pour la faute d'orthographe!!

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

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    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
    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