Note: the version of CORBA used for this comparison is omniORB.

COM CORBA
Interface names conventionally start with an I.
interface IFred { };
Interface names do not start with I.
interface Fred { };
Compile IDL files with "MIDL" compiler, generates:
Fred.h
Fred_i.c
Fred_p.c
Compile IDL files with "omniidl" compiler, generates:
Fred.hh
FredSK.cc
An object can have (be derived from) several interfaces. Each interface is typically derived from IUnknown. An object can have (be derived from) only one interface, typically derived (using multiple inheritance) from several interfaces. Each interface is derived from CORBA::Object.
"Server object" implementation:
class CObj : public IOne, public ITwo ...
"Servant object" implementation:
class CObj : public POA_Fred ...
where POA_Fred is the "skeleton class" generated by the IDL compiler for the interface Fred.
"Interface pointer":
IFred*
"Object reference":
Fred_ptr
"Smart pointer" provided by ATL (automatic release)
CComPtr<IFred>
"Object reference variable" (automatic release):
Fred_var
To initialise an interface pointer to null:
IFred* pFred = NULL;
To initialise an object reference to null:
Fred_ptr pFred = Fred::_nil();
To test for a null interface pointer:
if (pFred == NULL) ...
To test for a null object reference:
if (CORBA::is_nil(pFred)) ...
To obtain another interface on the same object:
pOne->QueryInterface(IID_ITwo, &pTwo);
To obtain another interface on the same object:
pTwo = Fred::_narrow(pOne);
To release an interface pointer:
pFred->Release();
To release an object reference:
CORBA::release(pFred);
To test whether two interface pointers refer to the same object:
pOne->QueryInterface(IID_IUnknown, &punkOne);
pTwo->QueryInterface(IID_IUnknown, &punkTwo);
if (punkOne == punkTwo)
...
To test whether two object references refer to the same object:
if (pOne->_is_equivalent(punkTwo)) ...