Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2

# XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 11/06/2007 11:33

Je développe un binding en XPCOM d'une bibliothèque relativement connue pour ses fonctions de manipulation audio : FMod.

FMod se présente comme une dll, un fichier lib et quelques interfaces .h.

Mais avant toute chose, j'essaie de faire marcher quelques fragments basiques de FMod au travers d'une interface XPCOM sollicitée par javascript. Sans utiliser FMod, le component marche sans problème. Mais lorsque j'utilise les fonctions de FMod cela se passe beaucoup moins bien...

J'enregistre mon composant, je le vois dans les fichiers 'compreg.dat' et 'xpti.dat'.

Au premier lancement de firefox qui procède à la regénération des deux fichiers compreg et xpti, je n'ai aucune erreur sur l'utilisation de mon objet XPCOM meme s'il ne produit pas l'effet désiré (lire un son).

Si je ferme Firefox et l'ouvre à nouveau, j'obtiens le code d'erreur 0x80570015 correspondant à NS_ERROR_XPC_CI_RETURNED lors de la création en javascript de l'instance du component (createInstance).

Est ce parce que mon component ne trouve pas la dll de FMod (je l'ai placé elle aussi dans le dossier components) ? Ou une mauvaise libération des ressources ?

Merci de vos conseils.

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : Paul Rouget

Date : 11/06/2007 11:54

Hum... je suspecte un soucis lié à l'enregistrement de ton composant. Tu as écrit quelque chose de particulier dans ton RegistrationProc ?

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 11/06/2007 12:58

J'ai suivi le quide de débuguage des composants XPCOM de ce site.

J'ai enlevé cette fonction appelée à la registration et le problème reste entier.

Aucune erreur n'est levée à la première création de l'objet XPCOM. Mais la méthode réalisant un appel à la bibliothèque externe ne s'éxecute pas correctement (ne produit pas de son) sans pour autant chuter (déclencher une erreur).

Je ferme firefox et l'ouvre à nouveau. J'ai une exception JS levée à la création de l'objet XPCOM (la meme qu'auparavent, NS_ERROR_XPC_CI_RETURNED).

L'implémentation de mon composant tient en moins d'un écran, et je vois entre autres choses ces spécificités :

  • j'initialise quelques ressources à la construction,
  • je dois réaliser une libération des ressources à la destruction,
  • j'utilise une bibliothèque externe.

Que je réalise ou pas la libération des ressources, que j'initalise ou pas mes objets, la première exécution se termine correctement.

J'ai ajouté pour pister mon erreur une méthode d'un exemple de composant que j'ai trouvé sur le net qui somme deux nombres. Cette méthode copiée collée se déroule bien la première fois (me répond bien la somme des deux nombres en input), mais la deucième fois elle ne peut pas s'exécuter du fait de l'erreur levée à l'appel createInstance().

Je pense vraiment que c'est une grosse bétise de ma part, mais l'erreur n'étant vraiment pas explicite, je ne sais pas trop de quel coté chercher.

Des idées ? Merci.

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : Paul Rouget

Date : 11/06/2007 13:22

Fais un pastbin de ton code, je jeterais un coup d'oeil. MAIS réduit la taille du code au minimum.

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 11/06/2007 15:42

Je te copie donc le code source que j'ai écrit. Le reste est autogénéré avec xpidl.exe. Je développe avec VS express. La déclaration :

#ifndef _MY_COMPONENT_H_
#define _MY_COMPONENT_H_
#include "IMyComponent.h"
//pour fmod...
#include "fmod.hpp"
#include "fmod.h"
#include "fmod_errors.h"

#define MY_COMPONENT_CONTRACTID "@mydomain.com/XPCOMSample/MyComponent;1"
#define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"
#define MY_COMPONENT_CID  {0x90758a97, 0xa6f3, 0x4ea4, \
   { 0x89, 0x53, 0x16, 0xbd, 0x2e, 0xe3, 0xa9, 0x77 }}

class MyComponent : public IMyComponent
{
public:
 NS_DECL_ISUPPORTS
 NS_DECL_IMYCOMPONENT
 MyComponent();
 ~MyComponent();
private:
FMOD::System *system;
};
#endif

L'implémentation :

#include "MyComponent.h"

NS_IMPL_ISUPPORTS1(MyComponent, IMyComponent)

MyComponent::MyComponent(){
FMOD::System_Create(&system);
system->init(100, FMOD_INIT_NORMAL, 0);}

MyComponent::~MyComponent(){
system->release();}

NS_IMETHODIMP MyComponent::PlaySound(const char *url){
/** specifique a fmod...known to work, mais nest meme pas appelé dans le js **/
FMOD::Sound *sound;
FMOD::Channel *channel;
system->createStream("http://manson.iiens.net/music/vacances drums.mp3", FMOD_CREATESTREAM, 0, &sound);
system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
   return NS_OK;}

Et le JS :

var obj;
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
	const cid = "@mydomain.com/XPCOMSample/MyComponent;1";
	obj = Components.classes[cid].createInstance();
	obj = obj.QueryInterface(Components.interfaces.IMyComponent);
    
} catch (err) {
	alert(err);
}

On remarque que d'après le JS, seul le constructeur et le destructeur devrait etre appelé... Je peux aussi mettre le projet VS express en ligne si quelqu'un a le courage de regarder. Faudrait juste que j'empacte la librairie de Fmod.

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : Paul Rouget

Date : 12/06/2007 14:27

C'est plutôt la partie enregistrement qui m'intéresse (IMPL_NSGETMODULE).

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 12/06/2007 14:40

#include "nsIGenericFactory.h"
#include "MyComponent.h"
#include <nspr.h>

NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)


static nsModuleComponentInfo components[] =
{
   {
      MY_COMPONENT_CLASSNAME, 
      MY_COMPONENT_CID,
      MY_COMPONENT_CONTRACTID,
      MyComponentConstructor   
   }
};

NS_IMPL_NSGETMODULE("MyComponentsModule", components) 

Merci de ton aide. J'avoue que sur cette partie j'ai pas fait grand chose...

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : Paul Rouget

Date : 12/06/2007 17:12

NS_IMPL_NSGETMODULE("MyComponentsModule", components)

bêtement, je ne sais pas si ça joue, mais mettre des guillemets, c'est étrange. Essaye:

NS_IMPL_NSGETMODULE(MyComponent, components)

(c'est en général comme que l'on fait).

Je ne pense pas que ça change quoi que ce soit, mais essaye quand meme.

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 12/06/2007 20:38

Cela ne change rien effectivement. Je précise que mon erreur est toujours la même : pas d'action lors de la première ouverture de FF mais composant reconnu et enregistré, et une erreur levée (cf plus haut) lorsque je ferme et ouvre à nouveau FF.

J'ai vérifié les fichiers compreg.dat et xpti.dat, et ils ne sont pas modifiés entre les deux lancements de FF.

Si j'enlève dans l'implémentation .cpp toute référence à FMOD, cela marche sans problème, même en laissant les inclusions dans le fichier .h de déclaration.

Il semble donc bien que mon erreur soit liée à l'utilisation de cette librairie externe...serait ce lié à l'initialisation de cet objet par le constructeur ? Je vais vérifier cela, mais cela me semble tout de même plus qu'étrange étant donné que je n'ai jamais rencontré de problème avec FMod...

# Re: XPCOM et utilisation d'une bibliothèque externe

Envoyé par : batman14

Date : 12/06/2007 20:57

Le problème ne se présente qu'à partir du moment où j'appelle une méthode sur un objet de fmod. Que j'éxecute ou pas cette méthode n'est pas important, c'est juste sa présence dans le code compilé qui semble importante (pourtant le constructeur de "System" doit bien être appelé à la construction de mon component et apparemment cela ne pose aucun problème).

Cette remarque aidera peut être les spécialistes C++ à comprendre mon problème et à enrichir ce forum. Merci en tout cas pour le temps que tu m'accordes Paul.

Aller à la page :  1 2

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.