See the question and my original answer on StackOverflow

There are basically two possibiities when doing COM communication: 1) in-process, 2) out-of-process.

If you want maximum performance, you really want to use in-process COM (your code will run in the same process as your client code, so there is no serialization or "marshaling" involved). In this case, there is not really any "communication" layer. COM is a very simple binary contract. It's described here: The layout of a COM object

More info about v-table performance can be found here: Virtual method table

Note there are some subtleties about in-process COM, especially the threading model. Even in-process you want to make sure you choose a threading model that will fit with your client/calling code. So in the "Mixed Model Development" chapter of the article, you want "direct access", not "marshaling" (in the table).