A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://www.codeproject.com/Articles/87465/A-Simple-XPCOM-Tutorial below:

A Simple XPCOM Tutorial - CodeProject

Step by step XPCOM creation and implementation in C++.

Purpose of this Article

I have written this tutorial for programmers who are just starting out in XPCOM. The article briefly covers writing your own XPCOM objects and how to reuse existing XPCOM components using VC8.0. This article does not cover XPCOM basics or concepts.

Project Settings and Development Setup was a big problem for me. Also, registering XPCOM is another troublesome issue because xpti.dat and compreg.dat must be deleted from the profile directory.

Introduction

XPCOM is a cross platform component object model, similar to Microsoft COM. It has multiple language bindings, letting XPCOM components be used and implemented in JavaScript, Java, and Python, in addition to C++. Interfaces in XPCOM are defined in a dialect of IDL called XPIDL.

For me, understanding XPCOM has been no less than an odyssey. I believe that every programmer who wishes to understand the basic principles behind XPCOM must write at least one simple XPCOM object using plain C++. In this article, I present the guidelines for creating simple XPCOM objects from first principles. The components should be usable by both VC++/ JavaScript clients.

As an exercise, we will attempt to design an XPCOM component that will implement a hypothetical super-fast addition algorithm. The component must take in two parameters of long data type, and return to the user another long parameter that will be an outcome of our addition algorithm.

How to write C++ XPCOM components Step 1: Development Setup

Here is what my folder structure looks like:

XPCOM
    - xulrunner-sdk
        bin
        lib
        idl
        include
       
    - sample_xpcom  (xpcom creation)
        Debug
        Release
Step 2: Create a VC++ Project Step 3: Create an XPCOM Component

An XPCOM component is made up of three parts:

Step 4: Register the XPCOM Component Now Start the Example

Let's specify a simple interface:

#include "nsISupports.idl"
                          
[scriptable, uuid(658ABC9E-29CC-43E9-8A97-9D3C0B67AE8B)]
interface ISample : nsISupports
{
  long    Add(in long a, in long b);
};

Remember to generate your own GUID.

The next step is to compile the IDL into a type-library (*.XPT) and a C++ header file (*.H), which we can use to define our implementation object. We have to use XPIDL.EXE twice, like this:

The generated H file actually has a skeleton implementation (commented out).

You can take the code and create the implementation H and CPP files. They could look like this:

Header file:

#ifndef _SAMPLE_H_
#define _SAMPLE_H_

#include "ISample.h"

#define SAMPLE_COMPONENT_CONTRACTID "@cn.ibm.com/XPCOM/sample;1"
#define SAMPLE_COMPONENT_CLASSNAME "Sample XPCOM Interface Layer"
#define SAMPLE_COMPONENT_CID  {0x658abc9e, 0x29cc, 0x43e9, 
              { 0x8a, 0x97, 0x9d, 0x3c, 0x0b, 0x67, 0xae, 0x8b } }
                      
//658abc9e-29cc-43e9-8a97-9d3c0b67ae8b
class CSample : public ISample
{
public:
      NS_DECL_ISUPPORTS
      NS_DECL_ISAMPLE
      
      CSample();
      virtual ~CSample();
                      
      //additional member functions
      int Add();
};
#endif

CPP file:

#include "Sample.h"
                          
NS_IMPL_ISUPPORTS1(CSample, ISample)
                      
CSample::CSample()
{
    /* constructor code */
}     

CSample::~CSample()
{
    /* destructor code */
}

/* long Add (in long a, in long b); */
NS_IMETHODIMP CSample::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval)
{
      *_retval = a + b;
      return NS_OK;
}

Lastly, we need to create the module implementation.

#include "nsIGenericFactory.h"
#include "Sample.h"

NS_GENERIC_FACTORY_CONSTRUCTOR(CSample)

static nsModuleComponentInfo components[] =
{
  {
      SAMPLE_COMPONENT_CLASSNAME,
      SAMPLE_COMPONENT_CID,
      SAMPLE_COMPONENT_CONTRACTID,
      CSampleConstructor,
  }
};
                  
NS_IMPL_NSGETMODULE("sample_module", components)
How to use XPCOM Components from C++ Code Step 1: Development Setup

Here is what my folder structure looks like:

XPCOM
    - xulrunner-sdk
        bin
        lib
        idl
        include
           
    - XULTesting (xpcom implementaion)
        Debug
        Release
Step 2: Create a VC++ Project

Here is the CPP file:

#include "stdafx.h"
#include "nsCOMPtr.h"
#include "nsServiceManagerUtils.h"

#include "../sample_xpcom/ISample.h"
#include "../sample_xpcom/Sample.h"
           
int _tmain(int argc, _TCHAR* argv[])
{
  nsresult rv;

  nsCOMPtr<nsiservicemanager> servMan;

  // You Can Get the service manager several ways
  // Get Service manager : WAY 1
  //---------------------------------------

  rv = NS_GetServiceManager(getter_AddRefs(servMan));
  if (NS_FAILED(rv))
  {
    printf("ERROR: XPCOM error [%x].\n", rv);
    return -1;
  }
  //-----------End of Getting Way 1 -----------------


  // Get Service manager : WAY 2
  //--------------------------------------------------
  /*
  // Initialize XPCOM and check for failure ...
  rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull); 
  if ( NS_FAILED(rv) )
  {
        printf("Calling NS_InitXPCOM returns [%x].\n", rv);
        return -1;
  }*/
  //-----------End of Getting Way 2 --------------------
        
  // Get the Component object;
  nsCOMPtr<isample> iSample;
  rv = servMan->GetServiceByContractID(SAMPLE_COMPONENT_CONTRACTID, 
                     NS_GET_IID(ISample),getter_AddRefs(iSample));

  if ( NS_FAILED(rv) )
  {
        printf("Calling GetServiceByContractID returns [%x].\n", rv);
        NS_ShutdownXPCOM(nsnull);
        return -1;
  }

  int nFirstVal, nSecondVal, nResult;
  nFirstVal= 5; 
  nSecondVal = 10;
  iSample->Add(nFirstVal, nSecondVal, &nResult);
                   
  _tprintf(_T("\nThe Result is : %d\n"), nResult);
  // Shutdown XPCOM
  // Here also several ways you can follow

  // Explicitly Releasing ISample
  //NS_RELEASE(iSample); 

  // Or Shutdown Service manager 
  // The nsIServiceManager instance that was returned by NS_InitXPCOM2 or nsnull.
  NS_ShutdownXPCOM(nsnull);

  return 0;
}
Next

My next article is about how to convert an MS COM component to an XPCOM component; i.e., step by step XPCOM creation from Microsoft COM.

References

For further details of XPCOM, the best reference is:

Note: An easy and simple way of learning this is to just use the projects and debug with break point. If there are any suggestions, requests, or problems, please inform me.

History

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.3