Voici le contenu de trois fichiers contenant un exemple basique d'un composant XPCOM (tirés du tutorial dont le lien est donné en fin de page).
Le fichier de définition d'interface '.idl' :
#include "nsISupports.idl"
[scriptable, uuid(90758A97-A6F3-4ea4-8953-16BD2EE3A977)] // Valeur donnée uniquement à titre d'exemple ; à changer.
interface IMyComponent : nsISupports
{
long Add(in long a, in long b); // Exemple de fonction.
};
Le fichier d'entête C++ '.h' ou '.hpp' :
#ifndef _MY_COMPONENT_H_ #define _MY_COMPONENT_H_ #include "IMyComponent.h" // Ce fichier est génèré à partir du '.idl' correspondant. #define MY_COMPONENT_CONTRACTID "@mydomain.com/XPCOMSample/MyComponent;1" // A remplacer par des valeurs à votre convenance. #define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample" // Idem. #define MY_COMPONENT_CID { 0x597a60b0, 0x5272, 0x4284, { 0x90, 0xf6, 0xe9, 0x6c, 0x24, 0x2d, 0x74, 0x6 } } // Valeur donnée uniquement à titre d'exemple ; à changer. /* Header file */ class MyComponent : public IMyComponent { public: NS_DECL_ISUPPORTS NS_DECL_IMYCOMPONENT MyComponent(); virtual ~MyComponent(); /* additional members */ }; #endif //_MY_COMPONENT_H_
Les identifiants peuvent être obtenus grâce à guidgen sous Windows ou uuidgen sous Linux. Celui du fichier .idl et celui du fichier .h ou .hpp doivent1) être différents.
Le fichier d'implémentation C++ '.cpp' :
#include "MyComponent.h" NS_IMPL_ISUPPORTS1(MyComponent, IMyComponent) MyComponent::MyComponent() { /* member initializers and constructor code */ } MyComponent::~MyComponent() { /* destructor code */ } /* long Add (in long a, in long b); */ NS_IMETHODIMP MyComponent::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval) // Exemple de fonction. { *_retval = a + b; return NS_OK; }