BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024
-
22 juin 2009 à 21:56
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024
-
6 juil. 2009 à 15:05
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...
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 24 juin 2009 à 04:45
- 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é.
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 23 juin 2009 à 20:56
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?