D = C + IDL instead of .h for interface (allows C++ smartpointers and C usage) **** .idl **** interface IXxxx : IUnknown library XxxxLibrary coclass CoXxxx **** .h **** class CoXxxx : ITest // IUnknown methods // IXxxx methods class CoXxxxFactory : IClassFactory // IUnknown methods // IClassFactory methods **** registry **** name -> co class GUID co class GUID -> name co class GUID -> DLL co class GUID -> library GUID library GUID -> library **** C++ usage **** IClassFactory *f = CoGetClassObject() IXxxx o = f->CreateInstance() or: IXxxx o = CoCreateInstance() or: import tlb IXxxxPtr p IXxxxPtr.CreateInstance() or: IXxxxPtr p() **** C usage **** IXxxx o = CoCreateInstance() IXxxx_Something(o, ...) **** actions **** translate CLSID to DLL via registry load DLL call DllGetClassObject to get instance of factory call factory CreateInstance with IID to get instance (calls AddRef on instance) use instance call Release