begin process at 2010 02 10 06:02:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Autre

 > 

DLL en C++ standard utilisé par une IHM en C#/WPF


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

DLL en C++ standard utilisé par une IHM en C#/WPF

lundi 22 juin 2009 à 21:56:42 | DLL en C++ standard utilisé par une IHM en C#/WPF

buno

Amis de la communautés bonjour!
J'aimerais savoir comment, depuis une IHM faite en C#/WPF, appeler une classe C++ se trouvant dans une DLL?
Sur le web, je vois principalement 2 méthodes:
- P/Invoke et DllImport : dans tous les exemples que je trouve ce sont des fonctions C qui sont appelées. Comment faire dans le cas de plusieurs classes? Je ne vais pas faire l'énumération de l'API complète, non?
- faire une classe Wrapper en C++ managé appelant ma classe en C++ non managé. A priori, ceci ne fonctionne que si la DLL a été faite avec des objets COM. Vrai? Sinon, comment faire exactement?

Je précise que la DLL ne contient que du C++ tout à fait standard.
D'avance, merci de vos retours (j'ai également posé la question sur CppFrance)

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
lundi 22 juin 2009 à 23:46:36 | Re : DLL en C++ standard utilisé par une IHM en C#/WPF

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !
Salut, c'est possible via P/Invoke, on utilise l'attribut DllImport et la convention d'appel ThisCall . La principale difficulté c'est qu'il te faut au moins une fonction en C pour créer l'objet avec "new" et une autre pour détruire l'objet avec "delete". J'ai posté un exemple ici -> http://www.csharpfr.com/forum/sujet-UTILISATION-FONCTIONS-CLASSE-PARTIR-DLL-CPLUSPLUS-DANS-APPLICATION_1272276.aspx
lundi 22 juin 2009 à 23:53:40 | Re : DLL en C++ standard utilisé par une IHM en C#/WPF

Lutinore

Administrateur CodeS-SourceS

Voilà l'exemple mis au propre :

// C++

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

class DLLEXPORT Device
{

private:

 HWND m_hWnd;

public:

 Device( HWND hWnd );
 ~Device( );

 BOOL Clear( UINT color );

};

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 = "
?Clear@Device@@QAEHI@Z " ) ]
    [ return: MarshalAs( UnmanagedType.Bool ) ]
    public static extern bool Clear( IntPtr pDevice, int color );
}

mardi 23 juin 2009 à 20:56:17 | Re : DLL en C++ standard utilisé par une IHM en C#/WPF

buno

Ok merci, je vais regarder ça de plus près.
Quelques questions en attendant:
- pour ajouter les fonctions create() et destroy(), cela suppose que j'ai accès au code de la DLL, ce qui est effectivement le cas pour moi. Dans le cas contraire, la méthode P/Invoke ne peut donc pas s'appliquer?
- la fonction Clear() fait partie de la classe Device. Je dois donc lister toutes les fonctions de toutes mes classes dans le DllImport?
- comment fait-on pour connaître la décoration des fonctions?

NB: y'a des mots clés que je ne maitrise pas encore (sealed, MarshalAs). Je file me documenter..mais je reviendrais sûrement

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
mercredi 24 juin 2009 à 04:45:34 | Re : DLL en C++ standard utilisé par une IHM en C#/WPF

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !

- Effectivement il faut avoir accès au code source ou une petite dll supplémentaire en flat C juste pour instancier et détruire la classe ou se tourner vers le C++/CLI pour mixer du code natif et du code managé.

- Oui tu vas devoir écrire toutes les définitions P/Invoke des méthodes ( que tu souhaites utiliser ) de ta classe native.

- EXTERN_C permet d'eviter la décoration des noms de fonctions mais pour les méthodes contenues dans une classe j'ai jamais trouvé comment l'eviter. J'utilise DumpBin.exe qui se trouve soit dans le platforme SDK ( soit dans VS, je sais plus ) pour trouver le nom décoré.

lundi 6 juillet 2009 à 15:05:32 | Re : DLL en C++ standard utilisé par une IHM en C#/WPF

buno

Merci Lutinore, ça m'a bien aidé, même si le projet a fait qu'on utilise la solution du Wrapper...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...


Cette discussion est classée dans : dll, classe, standard, ihm, wpf


Répondre à ce message

Sujets en rapport avec ce message

Dll externe + classe [ par marm0tte ] Salut, bon voila, j'ai pas trouvé sur le site, comment utliser une classe se trouvant dans une dll externe (wmi.dll)Je ne sais pas ocmment la déclarer utlisation dans une ihm d'une classe? [ par Cookai ] Bonjour,voila j'ai un petit probléme.Je sais que quand on créée une nouvelle feuille(WinForm) ,il se crée automatiquement une classe propre à cette pa Utilisation DLL C++ en C# [ par pma3d ] Bonjour à tous. Avant toute chose, je tiens à préciser que j'ai découvert à la fois .NET, C++ et les dlls il y a maintenant une semaine (vive l'ensei [.Net] Création de DLL et double chainage [ par Atmaweapon ] Bonjour à tous ! J'ai un problème pas forcément évident à expliquer, donc je me suis donné la peine de faire un schéma pour vous l'expliquer. Le voici Objet unique [ par fregolo52 ] Bonjour,Je suis en .NET 1.1Je me suis basé sur le snipper singleton de Nikoui mais ca ne marche pas.Ce que je veux, en gros, c'est un singleton multip generation dynamique de code [ par Blobette ] Bonjour à tous,Je suis à la recherche d'un moyen pour réaliser la chose suivante en C# : j'aurais une IHM dans laquelle l'utilisateur pourra ecrire en Dll, arguments & classe utilisateur [ par MyXiLo ] Bonjour,Je voudrais passer un argument dérivant d'une classe utilisateur à une méthode d'une dll.J'ai un programme qui contient une classe MaClass et utilisation de fonctions de classe à partir d'une DLL C++ dans une application C# [ par telephonerouge ] 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 création d'une dll usercontrol WPF sous express2008 [ par terrible ] bonsoir, j'ai créé un template pour développer sous express#2008 des usercontrol en wpf lorsque j'appelle mon modèle pour développer des usercontrol j Architecture logicielle C# .NET WPF DLL [ par jon_private ] Bonjour à tous, Je suis actuellement en train de travailler sur un projet, et j'aimerais avoir l'avis d'experts sur l'architecture que je souhaite me


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales