|
Publicité ' | ||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
Bonjour a tous, j'ai un petit pb de passage du monde non manage dans le monde manage..
je possede une dll ecrite en je ne sais quoi (C++ je pense) dont une des methode est Code :
typedef void(* cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type)(unsigned level, const char *msg) pour le moment j'utilise une fonction globale, exterieure a une classe, qui est : Code :
Code :
Or, je voudrai utiliser des evenements .NET et de ce fait utiliser une methode interne a une classe managee. j'ai un peu regarde les fonctions de mashalisations et de delegate. j'ai une classe managee : Code :
Code :
Le code compile sans warnings mais plante a l'execution comme si il n'arrivait pas a passer de messages ou d'arguments. Existe t'il une autre voie pour faire cela ? |
||||||||
|
|
00
|
|
|
#2 |
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
peut etre ne suis je pas sur le bon forum..
c'est plus du .NET que du C++/CLI ? |
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() Paul BacelarDéveloppeur informatique Inscription : février 2005 Messages : 2 651 ![]() |
J'ai appris des trucs, merci.
Primo, nommage C++ exporté d'une Dll, c'est bien pourri, l'éditeur de la Dll doit être un amateur. Je crains donc des "plaisanteries" avec des conventions d'appels "exotique" qui vont vous mettre dans l'embarras. ![]() http://msdn.microsoft.com/en-us/libr...v=vs.110).aspx Vous avez des petits détails comme l'utilisation de GCHandle::Alloc. |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
bonjour Bacelar,
ravi que cela puisse servir a qque chose Qu'appelez vous "nommage" ? dans le code plus haut, a quoi est ce que ca se refere ? je peux echanger avec l'editeur de la dll pour que sa dll soit plus compatible, mais faut t'il encore que je sache quoi lui demander ;-) merci pour le doc, je vais lire ca avec attention deja
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Paul BacelarDéveloppeur informatique Inscription : février 2005 Messages : 2 651 ![]() |
cm2: : fem : :solver_static_Newton::operating_mode_type::display_handler_type
Ca ressemble à un nom C++ et non C. Mais l'éditeur à peut-être fourni des en-têtes compatible C++ pour encapsuler des fonctions C++. Utiliser dependency walker (http://www.dependencywalker.com/) sur la Dll pour vérifier que c'est bien des fonctions C qui sont exportées. Si c'est des fonctions C++ (avec une décoration des noms tout bizarre), c'est très très moyen car cela interdit d'utiliser un autre compilateur ou version des librairies que ceux utilisé pour générer le Dll. Bonne lecture. |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() Développeur informatique Inscription : novembre 2006 Messages : 4 448 ![]() |
Salut juste une question
Code :
|
||
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Paul BacelarDéveloppeur informatique Inscription : février 2005 Messages : 2 651 ![]() |
C'est la Dll qui appelle, donc c'est elle qui mène le jeu. Il faut vous y conformer.
Mais je ne vois pas de difficultés. Au début de votre fonction, vous n'avez qu'a créer une String^ avec la chaine passée en paramètre. |
|
|
00
|
|
|
#8 | ||||
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
Paul,
Ci joint la sortie. En cochant la case C++. je pense que effectivement la dll est propre a un compilateur car l'editeur fournit plusieurs versions. Notamment pour VS2008, VS2010 x86 et x64 etc.. Donc a moi de savoir quelle bibli utiliser. Pour les en tetes, c'est qque chose comme : Code :
Code :
|
||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() Développeur informatique Inscription : novembre 2006 Messages : 4 448 ![]() |
|
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
malheureusement non car dans la gestion du solveur,
le mode de travail (et le handler) sont passé dans une classe operating_mode et le solveur appele par sa fonction run() doit utiliser qque part les parametres de cette classe. mais aucun n'est accessible donc.. rapé ! |
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Paul BacelarDéveloppeur informatique Inscription : février 2005 Messages : 2 651 ![]() |
Je ne vois pas d'impossibilité.
Vous passez un pointeur sur une fonction ok ? Qu'est-ce qui vous interdit de mettre un point d'arrêt au début de la dite fonction ?
|
|
|
00
|
|
|
#12 |
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
exact ! pfff.. c'etait si evident.
alors.. j'ai modifié le code en ajoutant le GCHandle::Alloc(ledelegate); lors de la premiere iteration, le handler rentre bien dans la fonction avec les bons parametres et peut faire une premiere ecriture. ensuite, des le moment ou le programme sort de la fonction et doit retourner dans la suite du solveur pour commencer sa seconde iteration.. Exception ! " An unhandled exception of type 'System.AccessViolationException' occurred in Ophelia.exe Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. " j'ai regardé la doc la dessus : http://msdn.microsoft.com/fr-fr/libr...exception.aspx aie !! |
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Paul BacelarDéveloppeur informatique Inscription : février 2005 Messages : 2 651 ![]() |
Si vous ne lui avez pas fourni de pointeurs foireux ou de pointeurs sur objets managés "migrants", c'est que c'est chez lui qu'il y a un problème.
Pouvez-vous avoir accès au code de la Dll, ou sinon à ses symboles shrinkés (.sym, .pdb, .deb, ...). L'éditeur a eu l'intelligence de ne pas intercepté en aveugle les exceptions, vous devriez donc avoir accès aux motifs réels du problème. Un pointeur foireux, fait juste savoir d'où il sort. ![]() Courage
|
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() |
Déjà, pourriez-vous poster votre code actuel? Dans une balise [ code ] si possible?
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#15 |
|
Invité régulier
![]() Denis Inscription : juillet 2012 Messages : 13 ![]() |
Bonsoir Paul,
Assez d'accord sur le fait que cela semble chez lui qu'il y a un pb. je leur en ai fait part mais il ne connait pas le code managé (C++ pur). Malheureusemeent je n'ai pas acces au code. Cependant il sont a l'ecoute et je vais leur faire un petit exemple pour qu'il puissent debugger leur fonctions. Ca va avancer ;-) je mets la discussion comme "resolue" meme si ce n'est pas entierement vrai mais ppalement parceque je pense que mes methodes de delegate fonctionnent et que le pb est ailleurs. Médinoc, effectivement, je ferai attention dorénavant. J'ai decouvert tard la balise code mais c'est pas mal et je vais m'en servir. @bientot denis |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com