Utilisation de fonctions de classe à partir d'une DLL C++ dans une application C

telephonerouge Messages postés 4 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 21 février 2009 - 19 févr. 2009 à 17:01
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 21 févr. 2009 à 19:43
bonjour,
Alors en tout désepoir je vous écris espérant que vous pourriez m'aider.
Alors mon problème est:
J'ai une application en C#.net qui ne contient que l'interface graphique, supposant que j'ai un bouton quand je clique dessus il fait appel à une méthode qui se trouve dans une classe qui elle me même se trouve dans une DLL écrite en C++.
je programme sous VS2005 et la DLL est un projet DLL MFC que j'ai écrite moi même.
le hic c'est que quand j'appelle une méthode qui ne fait partie d'une hiérarchie (d'une classe) tout se passe bien sinon pour appeler une méthode qui fait partie d'une classe ça ne marche pas il ne trouve pas la méthode dans la DLL.
C'est un peu tiré par les cheveux tout ça j'espère que vous m'avez compris.
Sinon si vous avez des exemple plus explicite à me donner ça serais super...
j'ai eu beau chercher sur tout les forums qui existent je ne trouve pas mon bonheur...
En vous remerciant d'avance.

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
19 févr. 2009 à 19:00
Salut, c'est long à expliquer.. mais voilà un de mes codes que j'ai épuré, tu devrais comprendre le principe :

// C++



#define EXTERN_C extern "C"
#define DLLEXPORT __declspec(dllexport)



class DLLEXPORT Device
{



private:



 HWND m_hWnd;



public:



 Device( HWND hWnd );
 ~Device( );
};



EXTERN_C DLLEXPORT Device* CreateDevice( HWND hWnd )
{
 Device* pDevice = new Device( hWnd );
 return pDevice;
}



EXTERN_C DLLEXPORT void DestroyDevice( Device* pDevice )
{
 if ( pDevice != NULL )
 {
  delete pDevice;
  //pDevice = NULL;
 }
}



// C#



[ SuppressUnmanagedCodeSecurity ]
internal sealed class Device
{
    private const string DLL_NAME = @"GX.dll";



    [ DllImport( DLL_NAME, CallingConvention = CallingConvention.StdCall ) ]
    public static extern IntPtr CreateDevice( IntPtr hWnd );
    [ DllImport( DLL_NAME, CallingConvention = CallingConvention.StdCall ) ]
    public static extern void DestroyDevice( IntPtr pDevice );



    [ DllImport( DLL_NAME,
        CallingConvention = CallingConvention.ThisCall,
            EntryPoint = "
[mailto:?Clear@Device@@QAEHI@Z
?Clear@Device@@QAEHI@Z
]
" ) ]
    [ return: MarshalAs( UnmanagedType.Bool ) ]
    public static extern bool Clear( IntPtr pDevice, int color );
}
0
telephonerouge Messages postés 4 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 21 février 2009
19 févr. 2009 à 19:03
Merci pour ta réactivité je vais voir ça et je te redirais ...
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
19 févr. 2009 à 19:16
J'ai tellement épuré que j'ai même éffacé le prototype de la fonction Clear;

class DLLEXPORT Device
{



private:



 HWND m_hWnd;



public:



 Device( HWND hWnd );
 ~Device( );



 BOOL Clear( UINT color );



};
0
telephonerouge Messages postés 4 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 21 février 2009
20 févr. 2009 à 13:03
Rebonjour ...
ça ne marche pas ...
je te mets un code tout bidon et si tu peux dire ça serais super ça peut te paraitre un peu bête mas ça m'aiderait vachement
mon code C++ dans ma DLL:

forme.cpp

#include "StdAfx.h"
#include "Forme.h"

__declspec(dllexport) Forme::Forme(void)
{
}
__declspec(dllexport) char* __stdcall Forme::carre2(){
return "je suis un carre de la classe Forme";
}

Forme::~Forme(void)
{
}

--------------------------
forme.h

#pragma once

class __declspec(dllexport)Forme
{
public:
    __declspec(dllexport) Forme(void);
    __declspec(dllexport) char* __stdcall carre2();
public:
    ~Forme(void);
};

------------

et dans mon appli C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace formeApplication
{
    public partial class Form1 : Form
    {
        [DllImport("formeDLL.dll", EntryPoint = "carre2")]
        public static extern String carre2();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            label1.Text = carre2();
        }
    }
}

voilààà.

Mercii
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
20 févr. 2009 à 19:56
faut dire.. t'as pas fait du tout mais alors pas du tout comme mon exemple.
0
telephonerouge Messages postés 4 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 21 février 2009
21 févr. 2009 à 16:11
coucou c'est à dire que c'est pas bon du tout? ....
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
21 févr. 2009 à 19:43
oui pas bon du tout.. dans mon exemple, j'exporte les fonctions Create et Destroy, j'utilise la convention d'appel ThisCall, j'utilise le  nom décoré de la fonction etc..
0