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