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 :

Probleme de creation de dll


Sujet :

MFC

  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut Probleme de creation de dll
    Salut à tous
    J'epprouve quelques problemes à mettre sous forme de dll une classe que j'ai crée. Cette classe a ete developpé en pure interface.
    Voila le code(je met que les .h vu que le code dans les .cpp est bon)

    EGESprite.h
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <GL/glut.h>
    #include <string>
    #include "EGEPOINT3D.h"
    #include "EGEColor4.h"
    #include "EGEColor3.h"
    #include "TGA/TGA.h"
     
    #ifndef _EGESPRITE
    #define _EGESPRITE
     
    #define EGE_LEFT_DOWN_CORNER_COLLIDE 1
    #define EGE_LEFT_UP_CORNER_COLLIDE 2
    #define EGE_RIGHT_UP_CORNER_COLLIDE 3
    #define EGE_RIGHT_DOWN_CORNER_COLLIDE 4
    #define EGE_LEFT_COLLIDE 5
    #define EGE_UP_COLLIDE 6
    #define EGE_RIGHT_COLLIDE 7
    #define EGE_DOWN_COLLIDE 8
    #define EGE_IS_COLLIDE 9
    #define EGE_IS_NOT_COLLIDE 0
     
     
    class EGESPRITE
    {
    protected:
        EGESPRITE();
     
    public:
        virtual ~EGESPRITE();
     
        static EGESPRITE* Create(char *Filename=NULL);
     
        virtual void Draw(int screenx,int screeny)=0;
        virtual void Draw(EGEPOINT3D screenposition)=0;
     
        virtual void DrawCenterX(int screeny)=0;
        virtual void DrawCenterY(int screenx)=0;
        virtual void DrawCenter(void)=0;
        virtual void DrawCenterAround(int screenx,int screeny)=0;
     
        virtual int GetSizeX(void)=0;
        virtual int GetSizeY(void)=0;
     
        virtual void SetSizeX(int s)=0;
        virtual void SetSizeY(int s)=0;
     
        virtual const char* GetFilename(void)=0;
     
        virtual int IsCollideWith(EGESPRITE *Sprite)=0;
     
        virtual EGEPOINT3D GetPosition(void)=0;
        virtual void SetPosition(EGEPOINT3D Pos)=0;
     
        virtual int GetPositionX(void)=0;
        virtual void SetPositionX(int screenx)=0;
     
        virtual int GetPositionY(void)=0;
        virtual void SetPositionY(int screeny)=0;
     
        virtual int GetPositionZ(void)=0;
        virtual void SetPositionZ(int screenz)=0;
     
        virtual GLuint GetId(void)=0;
     
        virtual void SetColor3(int r,int g,int b)=0;
        virtual void SetColor3(EGECOLOR3)=0;
     
        virtual EGECOLOR3 GetColor3(void)=0;
     
        virtual void SetColor4(int r,int g,int b,int a)=0;
        virtual void SetColor4(EGECOLOR4 c)=0;
     
        virtual EGECOLOR4 GetColor4(void)=0;
     
        virtual void SetOpacity(int alpha)=0;
        virtual int GetOpacity(void)=0;
    };
     
    #endif
    EGESprite_Private.h
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include "EGESprite.h"
    #include <string>
     
    using namespace std;
     
    #ifndef _EGESPRITE_PRIVATE
    #define _EGESPRITE_PRIVATE
     
    class EGESPRITE_PRIVATE: public EGESPRITE
    {
    private:
        EGEPOINT3D Position;
     
        EGEPOINT3D Size;
     
        EGECOLOR4 Color;
     
        GLuint Id;
     
        //gl_texture_t *Texture;
     
        string Filename;
     
    public:
     
        explicit EGESPRITE_PRIVATE(const char *Filename=NULL);
        ~EGESPRITE_PRIVATE();
     
        void Draw(int screenx,int screeny);
        void Draw(EGEPOINT3D screenposition);
     
        void DrawCenterX(int screeny);
        void DrawCenterY(int screenx);
        void DrawCenter(void);
        void DrawCenterAround(int screenx,int screeny);
     
        int GetSizeX(void);
        int GetSizeY(void);
     
        void SetSizeX(int s);
        void SetSizeY(int s);
     
        const char* GetFilename(void);
     
        int IsCollideWith(EGESPRITE *Sprite);
     
        EGEPOINT3D GetPosition(void);
        void SetPosition(EGEPOINT3D Pos);
     
        int GetPositionX(void);
        void SetPositionX(int screenx);
     
        int GetPositionY(void);
        void SetPositionY(int screeny);
     
        GLuint GetId(void);
     
        void SetColor3(int r,int g,int b);
        void SetColor3(EGECOLOR3);
     
        EGECOLOR3 GetColor3(void);
     
        void SetColor4(int r,int g,int b,int a);
        void SetColor4(EGECOLOR4 c);
     
        EGECOLOR4 GetColor4(void);
     
        void SetOpacity(int alpha);
        int GetOpacity(void);
     
        int GetPositionZ(void);
        void SetPositionZ(int screenz);
     
    };
     
    #endif
    DLL.def
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    EXPORTS
        Create
     
        Draw
        Draw
     
        DrawCenterX
        DrawCenterY
        DrawCenter
        DrawCenterAround
     
        GetSizeX
        GetSizeY
     
        SetSizeX
        SetSizeY
     
        GetFilename
     
        IsCollideWith
     
        GetPosition
        SetPosition
     
        GetPositionX
        SetPositionX
     
        GetPositionY
        SetPositionY
     
        GetPositionZ
        SetPositionZ
     
        GetId
     
        SetColor3
        SetColor3
     
        GetColor3
     
        SetColor4
        SetColor4
     
        GetColor4
     
        SetOpacity
        GetOpacity
    La compilation se passe sans probleme mais au link j'obtient les erreurs suivantes:
    LL.def : warning LNK4022: cannot find unique match for symbol "Draw"
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE:raw(int,int)" (?Draw@EGESPRITE_PRIVATE@@UAEXHH@Z) defined in .\Debug\EGESprite_Private.obj
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE:raw(class EGEPOINT3D)" (?Draw@EGESPRITE_PRIVATE@@UAEXVEGEPOINT3D@@@Z) defined in .\Debug\EGESprite_Private.obj
    .\DLL.def : warning LNK4022: cannot find unique match for symbol "SetColor3"
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE::SetColor3(int,int,int)" (?SetColor3@EGESPRITE_PRIVATE@@UAEXHHH@Z) defined in .\Debug\EGESprite_Private.obj
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE::SetColor3(class EGECOLOR3)" (?SetColor3@EGESPRITE_PRIVATE@@UAEXVEGECOLOR3@@@Z) defined in .\Debug\EGESprite_Private.obj
    .\DLL.def : warning LNK4022: cannot find unique match for symbol "SetColor4"
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE::SetColor4(int,int,int,int)" (?SetColor4@EGESPRITE_PRIVATE@@UAEXHHHH@Z) defined in .\Debug\EGESprite_Private.obj
    .\DLL.def : warning LNK4002: "public: virtual void __thiscall EGESPRITE_PRIVATE::SetColor4(class EGECOLOR4)" (?SetColor4@EGESPRITE_PRIVATE@@UAEXVEGECOLOR4@@@Z) defined in .\Debug\EGESprite_Private.obj
    LINK : fatal error LNK1152: cannot resolve one or more undecorated symbols
    LINK : fatal error LNK1141: failure during build of exports file

    Ca doit etre tout bete mais c'est la premier fois que je fais une dll etj'ai l'impression qu'il aime les surcharges de fonctions.
    Merci

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Salut.

    Le compilateur cherche des fonctions externes qui ne sont pas des méthodes d'une classe.

    Tu dois juste déclarer l'export de la classe.



    PS: je n'utilise jamais l'export de classe dans une dll, j'ai jamais réussi à faire fonctionner le truc convenablement. Je passe par les dll COM.

  3. #3
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Salut,

    L'exportation des fonctions ou des classes n'est pas chose compliqué.
    le mot clé a utiliser est __declspec(dllexport) qui se cache bien souvent sous différent MACRO

    Si votre dll n'exporte que des fonctions alors
    créer une DLL Win 32 si votre dll n'utilise que les API Win 32
    créer une DLL régulière MFC si votre dll utilise le support des MFC

    Si votre dll exporte aussi bien des fonctions que des classes alors
    créer une DLL d'extension MFC.

    Si votre dll exporte des fonctions appartenant à une classe qui font d'elles des fonctions membres mais sans exportés la classe elle-même alors
    créer une DLL ATL COM où la série des fonctions font partie d'une interface de votre objet composant COM.
    Mais si vous tenez quand même à exporter la classe dans ce cas réaliser un petit wrapper inline de votre classe COM dont ses fonctions membres délèguent directement l'appel aux fontions virtuelles de votre interface COM.


  4. #4
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Concernant le fichier de définition des modules *.def.
    Lorsque vous exportez vos fonctions, il faut indiquer le numéro d'ordre ou ordinal d'exportation de vos fonctions par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Create                                           @1
        Draw                                            @2
        DrawCenterX                                  @3
        DrawCenterY                                  @4
     
       ; ainsi de suite
    Les noms des fonctions exportées doivent être unique. car j'ai vu tantôt un doublon de draw.

    Pour la classe EGESPRITE, étant donnée qu'il utilise des fonctions virtuelles pure. L'approche d'une DLL ATL COM est convenable.

    On peut choisir EGESPRITE comme nom court de la classe COM et IEGESPRITE comme étant le nom de l'interface que le nouvel objet va implémenter.

    Ensuite se servir d'un CComPtr<IEGESPRITE> pour manipuler aisément l'objet.

  5. #5
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    whahoo c'est technique ca lol.
    Heu le probleme de faire une dll avec DLL ATL COM c'est que ca utilise les mfc nan?
    Ma classe est une classe avec des fonctions opengl(glut exactement) et j'ai pas envie de faire une dll qui depende de mfc.

  6. #6
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Exporter une seule fonction qui retourne une nouvelle instance de
    EGESPRITE_PRIVATE est une autre solution.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Citation Envoyé par drcd
    whahoo c'est technique ca lol.
    Heu le probleme de faire une dll avec DLL ATL COM c'est que ca utilise les mfc nan?
    Ma classe est une classe avec des fonctions opengl(glut exactement) et j'ai pas envie de faire une dll qui depende de mfc.
    Non pas du tout, tu peux parfaitement écrire une dll COM sans les MFC. Tu as un excellent tuto ici ->

    http://www.developpez.com/windows/dcom/t1.html

    Par contre les dll COM ne sont utilisables uniquement dans un environnement windows.

  8. #8
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Ha yes merci. Le coup de la factory ca marche bien. Surtout que je l'avais deja faite la factory lol. Heu Moldavi, les COM c'est un poil trop facile pour moi mdr. Nan enfait j'ai rien compris malgré le tuto.
    Merci à tous.

  9. #9
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Citation Envoyé par drcd
    Ha yes merci. Le coup de la factory ca marche bien. Surtout que je l'avais deja faite la factory lol. Heu Moldavi, les COM c'est un poil trop facile pour moi mdr. Nan enfait j'ai rien compris malgré le tuto.
    Merci à tous.
    Ce n'est pas aussi compliqué que ça en a l'air. Faut prendre le temps de digérer les différentes notions.

    Citation Envoyé par Gabrielly
    Si votre dll exporte aussi bien des fonctions que des classes alors
    créer une DLL d'extension MFC.
    Visiblement pour exporter des classes, il faut utiliser les MFC. Ceci expliquerait que ça n'a jamais bien fonctionné pour moi en C++ classique.

    Mais bon c'est pas grave, ça m'a permis de m'orienter sur COM et d'en apprécier tous les bénéfices.

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

Discussions similaires

  1. Probleme de creation de dll avec codeblock
    Par kiffou78 dans le forum Langage
    Réponses: 4
    Dernier message: 19/08/2009, 16h28
  2. Réponses: 2
    Dernier message: 08/04/2008, 10h58
  3. Probleme de creation de raccourcis
    Par Sebinou dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/04/2004, 18h21
  4. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 20h57
  5. [Classpath] problème de création de setclasspath.bat
    Par worldchampion57 dans le forum Général Java
    Réponses: 7
    Dernier message: 06/05/2003, 13h32

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