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!







Répondre avec citation




Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.



Partager