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 :
Du côté du source de l'OCX, ça donne ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 }
Donc pour résumer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ... }
- 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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
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!
Partager