XPCOM FAQ

Get out your decoder rings kids!

Having a basic understanding of COM is only the first
step. To get CMonkey code to build and run,
you  need to translate your COM ideas into Netscape
speak.

Feel free to add to this document or change incorrect info.
Hopefully more info and more examples will help new
people reach XPCOM nirvana more quickly.

To mentally translate XPCOM to COM.
 
vanilla COM XPCOM
 IUnknown nsISupports
IClassFactory nsIFactory
virtual void _stdcall NS_IMETHOD
interface ID = IID nsID = nsIID = IID
class ID = CLSID  nsCID = CID

Not too difficult.
But wait. There's more.
-------------------------------------------

Why don't those classes have AddRef?

Actually, those classes do have AddRef. It is hidden
in a macro. There are alot of  macros that are alot of  help
once you know :
    1) They exist.

    2) Where they are defined. (They aren't always mnemonic or onomatipeic.
            You might want to print them out.)

            mozilla/xpcom/public/nsCom.h
            mozilla/xpcom/public/nsISupports.h

    3)What they are
            Here's a short list to give you an idea of what you've been missing.
            The include files listed above are the real reference.

    4) A quick way to expand pesky macros:
              For macros in  foo.cpp,  'make foo.i'

            This will pump the foo.cpp file through C preprocessing
            and expand all the macros for you.  The output can be
            hard to read, but if you search for  unique strings
            in the area you aredebugging, you can navigate
            the file pretty easily.
            (thanks to hshaw@netscape.com)
 
 
 
Netscape MACRO Expansion of macro
NSADDREF(factoryinstname) Factory->AddRef();
NS_IMETHOD virtual nsresult __stdcall
NS_INIT_REFCNT() mRefCnt = 0
NS_INIT_ISUPPORTS() NS_INIT_REFCNT()
NS_DECL_ISUPPORTS public:
          NS_IMETHOD QueryInterface(REFNSIID aIID,
                            void** aInstancePtr);
          NS_IMETHOD_(nsrefcnt) AddRef(void);
          NS_IMETHOD_(nsrefcnt) Release(void);
    protected:
          nsrefcnt mRefCnt;

 Useful Links to COM Documents:

XPCOM  Page
nsCOMPtr
Coding Conventions
Getting BAMmed
How to COM
Modularization Techniques
C++ Portability Guide
NGLayout