Envoyé par : bub325
Date : 20/05/2009 14:06
Bonjour,
Je suis entrain de développer en C++ un objet XPCOM "XRManagerVariable" qui instancie et retourne un objet "XRVariable", lors de l'appel d'une fonction, afin de le retourner au JavaScript mais également de l'enregistrer dans un tableau.
Voici le code C++:
nsCOMPtr<XRVariable> XRManagerVariable::varTab[1000]; int XRManagerVariable::NBR = 0;
(...) XRManagerVariable::getVariable(XRVariable* *_retval) { XRVariable* variable = new XRVariable(); XRManagerVariable::varTab[XRManagerVariable::NBR]; *_retval = XRManagerVariable::varTab[XRManagerVariable::NBR++]; return NS_OK; }
Le problème que j'ai est que si, en javascript, je n'enregistre pas la XRVariable retournée par ma fonction getVariable ; mon objet est supprimé de la mémoire certainement par la machine virtuelle Javascript.
Comment indiquer à l'interface XPCOM que je veux garder en vie ces instances d'objets XRVariable ?
Envoyé par : laurentj
Date : 22/05/2009 15:04
ton XRVariable doit être un objet XPCOM (donc ayant une interface et hérite de nsISupports), et il faut alors incrémenter son compteur de reference. Vu que là tu ne l'incremente pas, ton objet va etre détruit par le mécanisme xpcom avant même qu'il soit retourné (dés que la fonction getVariable va se terminé).
*_retval = XRManagerVariable::varTab[XRManagerVariable::NBR++]; NS_ADDREF(*_retval);
D'ailleurs, je me demande si tu n'as pas des problèmes d'interface.
On ne fait pas
nsCOMPtr<nom_de_la_classe>
mais
nsCOMPtr<nom_de_l_interface_XPCOM>
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.