Callback et erreur mémoire
Bonjour à tous,
J'ai un petit problème lors de la réalisation d'un projet. Histoire d'expliquer un peu comment ça marche : j'ai un programme qui appelle un activeX. Jusque là tout va bien.
Mais ça se complique. Une callback est implémentée dans le programme appelant. Elle est ensuite appelée à partir de l'activeX. Tout ça fonctionne mais j'ai un problème : ça plante (erreur mémoire) lorsque je sors de la callback.
Voici un bout de code pour comprendre :
Programme appelant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
void maclasse::fonction()
{
wrapperActiveX.RegisterEventCallback(hdl, EventCallback, this);
wrapperActiveX.openURL(hdl, url);
}
void maclasse::EventCallback(HANDLE hdl, EVENT_TYPE p_event, void* params, void* paramsD) //statique
{
maclasse* pThis = static_cast<maclasse*>(pvAppData);
pThis->eventCallback(hdl, p_event, params);
}
void maclasse::eventCallback(HANDLE hdl, EVENT_TYPE p_event, void* params)
{
...//code fonctionnel
} |
Du côté du source de l'OCX, ça donne ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
int OCX::openURL(HANDLE hdl, char* url)
{
return DLLFunction_open( hdl, url);
}
bool DLLFunction_open(HANDLE hdl, char* url)
{
...
if (m_pEventCallback) //m_pEventCallback = EventCallback lors de l'appel à RegisterEventCallback
m_pEventCallback(ToHandle(), event, params, paramsD); //event = OpeningURL
...
} |
Donc pour résumer :
- Je registre ma callback en appelant une fonction de l'OCX en lui passant notamment le pointeur de fonction correspondant à ma callback (EventCallback).
- J'appelle ensuite une autre fonction de l'OCX (opeNURL) qui elle-même appelle la callback :
m_pEventCallback(ToHandle(), event, params, paramsD);
Je vois bien au débugger que l'on passe dans la callback.
- Une fois le traitement terminé, ça plante à la sortie de :
Code:
1 2 3 4 5
| void maclasse::EventCallback(HANDLE hdl, EVENT_TYPE p_event, void* params, void* paramsD) //statique
{
maclasse* pThis = static_cast<maclasse*>(pvAppData);
pThis->EventCallback(hdl, p_event, params);
} |
Au débugguer c'est après l'acolade de sortie que ça plante. Du côté OCX, je vois que je passe l'appel à la callback mais lorsque ça plante, je ne suis là aussi pas sorti de la fonction (DLLFunction_open) appellant la callback. Par contre le code suivant l'appel est exécuté sans problème.
Quelqu'un a t-il déjà rencontré un problème comme celui-là? J'ai l'impression que c'est un problème de pile mais je vois pas d'où il pourrait venir...
Merci d'avance!