Компонентная объектная модель COM
Компонентная объектная модель (COM) - это спецификация, описывающая, как создаются объекты, как они взаимодействуют, чтобы выполнить ту или иную функцию в системе. В соответствии с COM каждый объект имеет в своем составе интерфейсы. Интерфейс - это набор методов, т.е. функций, объединенных между собой для достижения какой-либо цели. К примеру, интерфейс IClassFactory служит для создания новых объектов COM и управления ими. Для этого в составе интерфейса IClassFactory имеются два метода: CreateInstance, создающий новый объект заданного класса, и LockServer, предотвращающий выгрузку программы-генератора объектов (сервера) из памяти. Обычно любой COM-объект содержит более одного интерфейса. Если взять, скажем, все тот же сервер для создания объектов, то в нем, кроме интерфейса IClassFactory, содержатся еще несколько интерфейсов, из которых самый важный - IUnknown. Как гласит спецификация компонентной объектной модели, любой объект должен содержать в себе интерфейс IUnknown. Его назначение - поиск других интерфейсов, включенных в объект (метод QueryInterface), и отслеживание счетчика блокировок (методы AddRef и Release). При создании нового объекта ему передается интерфейс IUnknown. Попутно вызывается метод AddRef, увеличивающий счетчик блокировок на единицу. Теперь, чтобы получить какой-нибудь другой интерфейс объекта, можно вызвать QueryInterface, который либо вернет вам требуемый интерфейс, либо код ошибки, говорящей о том, что такого интерфейса в составе объекта нет. Именно поэтому интерфейс IUnknown должен быть в каждом объекте: без него вы просто не сможете получить других требуемых для работы интерфейсов.
Внимательные читатели, владеющие каким-либо объектно-ориентированным языком программирования, обратят внимание на тот факт, что интерфейсы очень похожи на классы. И это правда, за исключением того, что в Си++ интерфейс описывается как структура с соответствующими методами. А вообще-то объекты COM можно создавать на различных языках программирования, главное, чтобы они соответствовали требованиям, описанным в спецификации COM. Хороший пример - пакет BorlandDelphi. Несмотря на то, что в его основе лежит язык ObjectPascal, с его помощью легко создавать COM-объекты.