COM это много разных вещей. Я рекомендую книгу Дона Бокса Essential COM как хороший способ учиться.
Как минимум, COM-объект - это объект, который предоставляет один интерфейс IUnknown. Этот интерфейс имеет 3 метода: AddRef, Release и QueryInterface. AddRef / Release позволяет подсчитывать ссылки на объект и автоматически удалять при освобождении последней ссылки. QueryInterface позволяет запрашивать объект для других интерфейсов, которые он поддерживает.
Большинство объектов COM доступны для обнаружения. Они зарегистрированы в реестре под HKEY_CLASSES_ROOT с идентифицирующим идентификатором GUID, который называется CLSID (идентификатор класса). Это позволяет вам вызывать CoCreateInstance для создания экземпляра зарегистрированного объекта, если вы знаете GUID. Вы также можете запросить реестр через COM API для CLSID, который поддерживает ProgId (идентификатор программы), который является строкой, идентифицирующей объект.
Многие COM-объекты имеют библиотеки типов, которые определяют интерфейсы и методы, которые поддерживает объект, а также IDispatch, который имеет метод Invoke, который позволяет динамически вызывать методы объекта. Это позволяет использовать объект из языков сценариев, которые не поддерживают строгую типизацию.
Некоторые объекты поддерживают запуск в другом процессе, в другом потоке или на другом компьютере. COM поддерживает сортировку для этих типов объектов. Если возможно, стандартный маршаллер может использовать typelib объекта для маршалинга вызовов объекта, но также могут быть предусмотрены и специальные маршаллеры.
И есть еще кое-что для COM-объектов, я едва царапаю поверхность.