passage d'une fonction d'une classe managee dans une dll c++ ou C (?) par delegate
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)
le but étant de passer la fonction de gestion "log" en tant que parametre.
pour le moment j'utilise une fonction globale, exterieure a une classe, qui est :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /**
\fn logfile_handler()
\brief utilise en tant que Handler pour les solveurs
*/
static void logfile_handler(unsigned level, const char* msg)
{
StreamWriter ^stream = File::AppendText("LOG.txt");
if (level < 10)
{
String ^message = gcnew String(msg);
stream->WriteLine(message);
}
stream->Close();
} |
et elle est passee en pointeur dans la classe de la dll par :
Code:
1 2 3 4
| solver_static_Newton::operating_mode_type solver_operatingmode;
// initialise le mode operatoire du solveur
solver_operatingmode.display_hdl = &logfile_handler; |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public ref class gsd_fea
{
constructeurs destructeur methodes etc...
// je cree un delegate et une fonction qui me permettrait de gérer
// le handler du solveur :
public: delegate void gsdfea_delegate_logfile_handler(unsigned level, const char* msg);
void gsdfea_logfile_handler(unsigned level, const char* msg)
{
StreamWriter ^stream = File::AppendText("LOGDELEGATE.TXT");
if (level < 10)
{
String ^message = gcnew String(msg);
stream->WriteLine(message);
}
}
stream->Close();
}
} |
et la j'utilise la fonction de marshalisation pour passer du monde manage au non manage par :
Code:
1 2 3 4 5
| solver_static_Newton::operating_mode_type solver_operatingmode;
// initialise le mode operatoire du solveur
gsd_fea::gsdfea_delegate_logfile_handler ^logtodo = gcnew gsd_fea::gsdfea_delegate_logfile_handler(this,&gsd_fea::gsdfea_logfile_handler);
solver_operatingmode.display_hdl = (cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type) Marshal::GetFunctionPointerForDelegate(logtodo).ToPointer(); |
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 ?