Passage objet managé à une callback appelée par une dll native
Bonjour à tous,
Pb assez spécifique d'où l'intitulé qui fait 20bornes :lol:
Je développe un projet Windows Form en c++ managé qui nécessite l'utilisation d'une dll native.
Celle-çi contient une méthode du type :
Code:
1 2
|
void addCallback(void* object, void (*returnValueCallback)(void*, int)); |
Voici l'interface de mon objet managé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#pragma once
#include "cli_ptr.h"
using namespace System;
using namespace System::Windows::Forms;
public ref class MonObjet
{
public:
MonObjet(String^ name, String^ ip, int port);
~MonObjet();
String^ m_name;
String^ m_ip;
int m_port;
}; |
et l'implémentation :
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 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#include "stdafx.h"
#include "MonObjet.h"
void callback_portMonObjetValueChanged(void* baton, int port);
MonObjet::MonObjet(String^ name, String^ ip, int port)
{
m_name = name;
m_ip = ip;
m_port = port;
shared_ptr<cli_ptr<MonObjet>> ptr = cli_ptr<MonObjet>::Create(this);
void* objetVoid = ptr->GetNative();
maDll->addCallback(objetVoid , &callback_portMonObjetValueChanged);
}
MonObjet::~MonObjet()
{
}
///////////////////////////////////////////////////////////
//Callbacks
///////////////////////////////////////////////////////////
void callback_portMonObjetValueChanged(void* objet, int port)
{
// get the managed object
shared_ptr<cli_ptr<MonObjet>> ptr2 = cli_ptr<MonObjet>::Create(objet);
MonObjet^ monObjet= ptr2->GetManaged<MonObjet>();
// update the MonObjet port attribute
monObjet->m_port = port;
} |
Pour convertir mon O.M. en void* (qui sera en fait le premier arg du callback appelé par ma dll) et vice-versa j'utilise la merveilleuse classe "cli_ptr" que j'ai trouvé sur le blog de Paslatek http://www.paslatek.net/shared_ptr-o...090909-23.aspx
Mon pb : impossible de récup la bonne instance de MonObjet dans le callback
Je récupère bien un Objet du type MonObjet mais impossible d'accéder à ses membres, monObjet est nullptr !
Je précise que la classe "cli_ptr" fonctionne si je l'utilise simplement, sans passer par la dll native.
Ce que je veux faire est il possible ?
Si oui j'ai du faire une bourde qlq part...
Qlq'un a-t-il une idée svp ?